父類 子類成員變量關係:
若是子類的引用調用 父類有但是子類沒有 成員變量時候
子類其實調用的是父類的成員變量, 但是也是屬於子類的屬性(特性),該屬性受父類的變化影響
子類在new的時候產生了一個父類對象 在內存中,
class Animal {
protected String name= "mimi";
public String getName() {return name;}
}
class Cat extends Animal{
String name;
Cat(String name) {
this.name = name;
}
}
public class Test3 {
public static void main(String[] args) {
Cat c1 = new Cat("pipi");
System.out.println(c1.getName()); // 返回“mimi”
System.out.println(c1.name); // 返回“pipi”
Animal c2 = (Animal)c1;
System.out.println(c2.name); // 返回“mimi”
}
}
因爲,有繼承關係的兩個類是這樣的,最終new出來的子類的對象的內部會有一個父類對象,在這裏也就是說,這Cat對象的內部包含有一個Animal對象,而且Cat類中並沒有定義getName()方法,換句話說就是沒有重寫父類Animal的getName()方法,所以c1.getName(),表面上看,我們總是說此方法是繼承下來的
,所以在Cat類中沒有定義,但是可以使用,這只是表面上這麼理解,實際上內存中是什麼樣?就是我上面說的那樣,Cat對象的內部還有一個Animal對象,所以c1.getName()的時候,實際上是調用的它裏面的那個父類Animal對象的getName()方法,而Animal類中定義的getName()是return name;注意,return的這個name指的是自己Animal的name,對吧,所以打印出mimi