Vererbung - Methode vs Attribut?

flashray

Erfahrenes Mitglied
Hallo,

Java:
public class AA {
	String s = "s in AA";

	String m() {
		return "m in AA";
	}

	public static void main(String[] args) {
		AA a = new BB();
		System.out.println(a.m());
		System.out.println(a.s);
	}
}

public class BB extends AA {
	String s = "s in BB";

	String m() {
		return "m in BB";
	}
}

Ausgabe:
Code:
m in BB
s in AA

Frage: Wieso wird hier die Methode m der Klasse BB hingegen das Attribut s aus AA aufgerufen?


Vg Erdal
 
Hallo,
weil die Methoden abhängig vom dynamischen Typ des Objektes zur Laufzeit
aufgelöst werden. Bei Attributen hingegen ist das nicht der Fall, der Aufruf dieser
hängt nämlich nur vom statischen Typ des Objektes ab...

P.S. Attribute kann man ja auch nicht überschreiben in dem Sinne...

Gruß,
RedWing
 
Zuletzt bearbeitet:
Danke Redwing,

hab nun noch einen Getter eingebaut. Jetzt stimmt die Ausgabe. D.h. bei Verwendung von Vererbung sollte man stets Getter und Setter einbauen damit es später keine Überraschungen gibt!

Java:
package klSS04;

public class AA {
	private String s = "s in AA";

	public String getS() {
		return s;
	}

	public String m() {
		return "m in AA";
	}

	public static void main(String[] args) {
		AA a = new BB();
		System.out.println(a.m());
		System.out.println(a.getS());
	}
}

class BB extends AA {
	private String s = "s in BB";

	public String getS() {
		return s;
	}

	public String m() {
		return "m in BB";
	}
}

Code:
m in BB
s in BB


Vg Erdal
 
D.h. bei Verwendung von Vererbung sollte man stets Getter und Setter einbauen damit es später keine Überraschungen gibt!

Eigentlich nicht weiter überraschend, wenn man im Hinterkopf behält das Attribute
nicht virtuell sein können. Es macht da auch keinen Sinn, da man Attribute, die ja
bekanntlich nur einen Wert besitzen, nicht mit einer Implementation versehen kann,
demnach nicht reimplementieren kann und daher auch nicht polymorph gestalten
kann...

Gruß,
RedWing
 
Da man Attribute auch als private deklariert und nicht public (im normalfall) sollte man damit auch keine Probleme haben.
 
Hallo,

illaX hat gesagt.:
Da man Attribute auch als private deklariert und nicht public (im normalfall) sollte man damit auch keine Probleme haben.

Naja wenn man vom nichtvirtuellen Verhalten eines Attributes überrascht ist
nützt auch das private nichts um den Überraschungseffekt zu verhindern:

Java:
class A{
    private String s = "s in A";
    String m(A a) {
        return a.s;
    }
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.m(a));
    }
}

class B extends A{
    private String s = "s in B";
}

//edit: Obwohl du hast Recht, es wäre dann am Kode ersichtlich...

Gruß,
RedWing
 
Zuletzt bearbeitet:
Zurück