739 Stimmen

Kann eine abstrakte Klasse einen Konstruktor haben?

Kann eine abstrakte Klasse einen Konstruktor haben?

Wenn ja, wie und für welche Zwecke kann es verwendet werden?

10voto

Harshil Punkte 1114

Obwohl es viele gute Antworten gibt, möchte ich meine 2 Cents dazugeben.

Konstrukteur BAUT DAS OBJEKT NICHT . Sie wird zur Initialisierung eines Objekts verwendet.

Ja, eine abstrakte Klasse hat immer einen Konstruktor. Wenn Sie keinen eigenen Konstruktor definieren, wird der Compiler der abstrakten Klasse einen Standardkonstruktor zuweisen. Dies gilt für alle Klassen - verschachtelte, abstrakte, anonyme, usw.

Eine abstrakte Klasse (im Gegensatz zu einer Schnittstelle) kann nicht-finale, nicht-statische Felder haben, die initialisiert werden müssen. Sie können einen eigenen Konstruktor in die abstrakte Klasse schreiben, um dies zu tun. Aber in diesem Fall wird es keinen Standardkonstruktor geben.

public abstract class Abs{
    int i;
    int j;
    public Abs(int i,int j){
        this.i = i;
        this.j = j;
        System.out.println(i+" "+j);
    }
}

Seien Sie vorsichtig, wenn Sie die obige abstrakte Klasse erweitern, Sie müssen in jedem Konstruktor explizit super aufrufen. Die erste Zeile eines jeden Konstruktors ruft super() auf. Wenn Sie super() nicht explizit aufrufen, wird Java das für Sie tun. Der untenstehende Code wird nicht kompiliert:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    System.out.println("2 arg");
}
}

Sie müssen es wie im folgenden Beispiel verwenden:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    super(i,j);
    System.out.println("2 arg");
}
}

1 Stimmen

Konstrukteur baut das Objekt nicht auf. Er wird zur Initialisierung der Felder .

7voto

Alok Punkte 123

Eine abstrakte Klasse kann einen Konstruktor haben, ABER man kann kein Objekt einer abstrakten Klasse erstellen, also wie kann man diesen Konstruktor verwenden?

Die Sache ist, wenn Sie diese abstrakte Klasse in Ihrer Unterklasse erben, können Sie Werte an ihren (abstrakten) Konstruktor über die super(value)-Methode in Ihrer Unterklasse übergeben, und nein, Sie erben keinen Konstruktor.

Mit super können Sie also Werte in einem Konstruktor der abstrakten Klasse übergeben, und soweit ich mich erinnere, muss dies die erste Anweisung in Ihrer Methode oder Ihrem Konstruktor sein.

6voto

Raj Baral Punkte 643

Im Allgemeinen wird ein Klassenkonstruktor verwendet, um Felder zu initialisieren, d.h. ein Konstruktor einer abstrakten Klasse wird verwendet, um Felder der abstrakten Klasse zu initialisieren. Sie würden einen Konstruktor für eine abstrakte Klasse bereitstellen, wenn Sie bestimmte Felder der abstrakten Klasse initialisieren wollen, bevor die Instanziierung einer Kindklasse erfolgt. Ein Konstruktor für eine abstrakte Klasse kann auch dazu verwendet werden, Code auszuführen, der für jede Unterklasse relevant ist. Dadurch wird doppelter Code vermieden.

Wir können keine Instanz einer abstrakten Klasse erstellen, aber wir können Instanzen von Klassen erstellen, die von der abstrakten Klasse abgeleitet sind. Wenn also eine Instanz einer abgeleiteten Klasse erstellt wird, wird automatisch der Konstruktor der übergeordneten abstrakten Klasse aufgerufen.

Hinweis : Dieser Artikel

6voto

Jacob Punkte 61

Ja, abstrakte Klassen Konstruktoren sind in der Regel für Super-Aufrufe für die Initialisierung Ereignisse gemeinsam für alle Unterklassen verwendet

5voto

Ketan G Punkte 497

Ja, abstrakte Klassen können Konstruktoren haben!

Hier ist ein Beispiel für die Verwendung eines Konstruktors in einer abstrakten Klasse:

abstract class Figure { 

    double dim1;        
    double dim2; 

    Figure(double a, double b) {         
        dim1 = a;         
        dim2 = b;         
    }

    // area is now an abstract method 

   abstract double area(); 

}

class Rectangle extends Figure { 
    Rectangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for rectangle 
    double area() { 
        System.out.println("Inside Area for Rectangle."); 
        return dim1 * dim2; 
    } 
}

class Triangle extends Figure { 
    Triangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for right triangle 
    double area() { 
        System.out.println("Inside Area for Triangle."); 
        return dim1 * dim2 / 2; 
    } 
}

class AbstractAreas { 
    public static void main(String args[]) { 
        // Figure f = new Figure(10, 10); // illegal now 
        Rectangle r = new Rectangle(9, 5); 
        Triangle t = new Triangle(10, 8); 
        Figure figref; // this is OK, no object is created 
        figref = r; 
        System.out.println("Area is " + figref.area()); 
        figref = t; 
        System.out.println("Area is " + figref.area()); 
    } 
}

Ich denke, Sie haben die Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X