Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
VariablenGültigkeit von Klassenvariablen bei Vererbung?
ich verstehe folgendes bei der Vererbung nicht: wenn ich versuche in der Kindklasse 'Astra' auf die Variable 'name' zuzugreifen, dann scheint sie dort nicht bekannt zu sein. Aber die Kindklasse ruft doch automatisch den Konstuktor der Elternklasse 'Opel' auf, warum ist denn die Variable nicht bekannt?
Opel.java:
Code:
public class Opel {
public Opel () {
String name = "Opel";
System.out.println(name);
}
public static void main(String args[]) {
new Opel();
new Astra();
}
}
Astra.java:
Code:
public class Astra extends Opel {
public Astra () {
// super();
this.name = "Astra"; //<-- Uncompilable source code - cannot find symbol
System.out.println(name);
}
}
name ist eine lokale Variable im Konstruktor der Opel-Klasse. Woanders als dort ist die nicht existent.
Wenn du eine Member-Variable (wahrscheinlich meinst du das mit "Klassenvariable") haben willst, musst du sie außerhalb von Methoden bzw. Konstruktoren deklarieren.
ich verstehe folgendes bei der Vererbung nicht: wenn ich versuche in der Kindklasse 'Astra' auf die Variable 'name' zuzugreifen, dann scheint sie dort nicht bekannt zu sein. Aber die Kindklasse ruft doch automatisch den Konstuktor der Elternklasse 'Opel' auf, warum ist denn die Variable nicht bekannt?
Die Variable name ist lokal innerhalb eines Konstruktors deklariert und nur dort bekannt. Nicht mal innerhalb der Klasse von ausserhalb des Konstruktors wirst Du auf diese Variable zugreifen können. Es ist eh eine schlechte Idee, direkt auf Variablen zuzugreifen. Besser ist es, mit einem Getter zu arbeiten. Deine Variable muss aber als Feld deklariert sein. Hier ein kleines Beispiel
Aber wofür brauch ich denn dann einen Konstruktor im Allgemeinen, wenn ich nachher selbst von der eigenen Klasse nicht mehr drauf zugreifen kann?
Und wie könnte ich aus der Kindklasse den Standardnamen "Astra" bei der Erzeugung des Objekts verwenden? Ich hätte jetzt gedacht, das mache ich mit "super(name);" im Astra-Konstruktor, aber dem ist wohl nicht so.
Code:
public class Opel {
private String name = "Opel";
public String getName() {
return this.name;
}
public Opel() {
System.out.println(getName());
}
public Opel(String name) {
this.name = name;
System.out.println(getName());
}
public static void main(String args[]) {
new Opel();
new Astra();
}
}
Code:
public class Astra extends Opel {
private String name = "Astra";
public Astra() {
super(this.name); //<-- cannot reference name before supertype constructor has been called
}
}
public class Opel {
// ...
public Opel() {
this("Opel");
}
protected Opel(String name) {
setName(name);
}
// ...
}
public class Astra extends Opel {
public Astra() {
super("Astra");
}
}