Objektreferenz

Say

Aktives Mitglied
Hallo zusammen,

Obwohl ich super(o); im Konstruktor Y entferne (Zeile 14), kompiliert das Programm und gibt das Richtige aus. Warum darf man das? Ich dachte, super muss immer vorhanden sein, solange es eine Vererbung gibt.

Java:
class X {
    public X m(){
        return new X(this);
    }
    public X(){}
    public X(X o){}

}
class Y extends X{
    public Y m(){
        return new Y(this);
    }
    public Y(){}
    public Y(Y o) { super(o);}
}
class Test{
    public static void main(String [] args){
        Y y1 = new Y();
        Y y2 = new Y(y1);
        System.out.println(y1.equals(y2));
    }
}
 

LimDul

Top Contributor
Wenn du keinen super-Aufruf explizit drin hast, wird implizit der Standard-Konstruktor der Oberklasse (der ohne Parameter - Zeile 5) aufgerufen.
 

Say

Aktives Mitglied
Wenn du keinen super-Aufruf explizit drin hast, wird implizit der Standard-Konstruktor der Oberklasse (der ohne Parameter - Zeile 5) aufgerufen.
Also d.h. ohne super, würde es immer funktionieren, es wird einfach der Standard-Konstruktor der Superklasse aufgerufen. Gibt es Fälle, wo super sicher drin sein muss?
 

LimDul

Top Contributor
Wenn die Oberklasse keinen Standard-Konstruktor hat, es also in der Oberklasse nur Konstruktoren mit Parameter gibt. Dann musst du den passenden explizit aufrufen. Wenn du also Zeile 14 und Zeile 5 löschst, wirst du eine Fehlermeldung vom Compiler bekommen.
 

Say

Aktives Mitglied
Wenn die Oberklasse keinen Standard-Konstruktor hat, es also in der Oberklasse nur Konstruktoren mit Parameter gibt. Dann musst du den passenden explizit aufrufen. Wenn du also Zeile 14 und Zeile 5 löschst, wirst du eine Fehlermeldung vom Compiler bekommen.
Wenn ich die Zeile 5 lösche, könnte es nicht den automatisch generierten Konstruktor aufrufen?
 

Say

Aktives Mitglied
Java:
public Object m(){ return new Y(this);}

Wenn ich diesen Code in die Klasse Y einfüge, warum kompiliert es nicht? Ist Objekt nicht die Superklasse von allen?
 

Say

Aktives Mitglied
Was ist genau ein Kopie-Konstruktor, wann brauche ich den überhaupt? Verstehe das Prinzip nicht. Können wir uns auf den Default-Konstruktor verlassen, wenn wir den Kopie-Konstruktor entfernen. Welcher ist der Default-Konstruktor und welcher ist der Kopie-Konstruktor?
 

temi

Top Contributor
Was ist genau ein Kopie-Konstruktor, wann brauche ich den überhaupt? Verstehe das Prinzip nicht. Können wir uns auf den Default-Konstruktor verlassen, wenn wir den Kopie-Konstruktor entfernen. Welcher ist der Default-Konstruktor und welcher ist der Kopie-Konstruktor?
Der Kopier-Konstruktor dient dazu eine Kopie des Objektes zu erstellen. Er wird benötigt, wenn man eine Kopie des Objektes benötig, sehr platt gesagt.
Java:
class Foo {
 
    int bar;
 
    public Foo(int val) {
        bar = val;
    }
 
    // Copy constructor
    public Foo(Foo foo) {
        this(foo.bar); // new Foo with bar from foo
    }
}
Das kann natürlich deutlich komplizierter werden, wenn im Objekt dynamischere Datenstrukturen gespeichert sind. Default- und Kopier-Konstruktor haben miteinander überhaupt nichts zu tun.
 
Zuletzt bearbeitet:

temi

Top Contributor
Je nach Implementation der Klasse hinterlässt der Default-Konstruktor ein mehr oder weniger initialsiertes Objekt.
Java:
class Foo {
    int value1; // wird mit 0 initialsiert
    int value2 = 42; // wird mit 42 initialsiert
    List<String> list1; // wird mit null (!!!) initialsiert
    List<String> list2 = new ArrayList<>(); // wird mit einer leeren Liste initialisiert
}
 
Zuletzt bearbeitet:

Say

Aktives Mitglied
Der Kopier-Konstruktor dient dazu eine Kopie des Objektes zu erstellen. Er wird benötigt, wenn man eine Kopie des Objektes benötig, sehr platt gesagt.
Java:
class Foo {
 
    int bar;
 
    public Foo(int val) {
        bar = val;
    }
 
    // Copy constructor
    public Foo(Foo foo) {
        this(foo.bar); // new Foo with bar from foo
    }
}
Das kann natürlich deutlich komplizierter werden, wenn im Objekt dynamischere Datenstrukturen gespeichert sind. Default- und Kopier-Konstruktor haben miteinander überhaupt nichts zu tun.
Warum braucht man einen Kopier-Konstruktor, verstehe ich nicht ganz.
 

mihe7

Top Contributor
wann brauche ich den überhaupt? Verstehe das Prinzip nicht
Es geht um den Unterschied von "das gleiche" und "das selbe". Zwei Referenzen können auf das selbe Objekt verweisen oder auf zwei Objekte, die inhaltlich gleich sind.

Java:
Point punkt = new Point(3,2); // rechts wird ein neues Objekt erzeugt, dessen Adresse in Variable punkt abgelegt wird.
System.out.println(punkt.x); // es wird 3 ausgegeben.
Point zweiterPunkt = punkt; // die in punkt gespeicherte Adresse wird der Variablen zweiterPunkt zugewiesen
zweiterPunkt.x = 5; // die x-Koordinate des Objekts wird geändert.
System.out.println(punkt.x); // es wird 5 ausgegeben.

EDIT: Hier verweisen punkt und zweiterPunkt also auf das selbe Objekt.

Java:
Punkt punkt = new Point(3,2);
Punkt zweiterPunkt = new Point(3,2);
Hier hat man zwei Objekte, die nur inhaltlich gleich sind.

Möchte man nicht, dass ein Objekt verändert wird, verwendet man eine Kopie des Objekts. Dafür eignet sich dann ein Copy-Konstruktor.
 

mihe7

Top Contributor
Und noch eine Ergänzung: aus dem Grund vergleicht man Objekte normalerweise per equals(), weil man an der inhaltlichen Gleichheit interessiert ist. Will man wissen, ob zwei Variablen auf das selbe Objekt verweisen, verwendet man ==.
 

Say

Aktives Mitglied
Es geht um den Unterschied von "das gleiche" und "das selbe". Zwei Referenzen können auf das selbe Objekt verweisen oder auf zwei Objekte, die inhaltlich gleich sind.

Java:
Point punkt = new Point(3,2); // rechts wird ein neues Objekt erzeugt, dessen Adresse in Variable punkt abgelegt wird.
System.out.println(punkt.x); // es wird 3 ausgegeben.
Point zweiterPunkt = punkt; // die in punkt gespeicherte Adresse wird der Variablen zweiterPunkt zugewiesen
zweiterPunkt.x = 5; // die x-Koordinate des Objekts wird geändert.
System.out.println(punkt.x); // es wird 5 ausgegeben.

EDIT: Hier verweisen punkt und zweiterPunkt also auf das selbe Objekt.

Java:
Punkt punkt = new Point(3,2);
Punkt zweiterPunkt = new Point(3,2);
Hier hat man zwei Objekte, die nur inhaltlich gleich sind.

Möchte man nicht, dass ein Objekt verändert wird, verwendet man eine Kopie des Objekts. Dafür eignet sich dann ein Copy-Konstruktor.
Vielen Dank für die ausführliche Erklärung.
 

Ähnliche Java Themen

Neue Themen


Oben