1龄坪,成員變量:
在多態(tài)中焙格,子父類成員變量同名瓮床。
- 在編譯時期:參考的是引用型變量所屬的類中是否有調(diào)用的成員芜茵。(編譯時不產(chǎn)生對象叙量,只檢查語法錯誤)
- 運行時期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。
- 簡單一句話:無論編譯和運行九串,成員變量參考的都是引用變量所屬的類中的成員變量绞佩。
- 再說的更容易記憶一些:成員變量 --- 編譯運行都看 = 左邊。
2蒸辆,成員函數(shù)征炼。
- 編譯時期:參考引用型變量所屬的類中是否有調(diào)用的方法析既。
- 運行時期:參考的是對象所屬的類中是否有調(diào)用的方法躬贡。
為什么是這樣的呢?因為在子父類中眼坏,對于一模一樣的成員函數(shù)拂玻,有一個特性:覆蓋酸些。 - 簡單一句:成員函數(shù),編譯看引用型變量所屬的類檐蚜,運行看對象所屬的類魄懂。
- 更簡單:成員函數(shù) --- 編譯看 = 左邊,運行看 = 右邊闯第。
3市栗,靜態(tài)函數(shù)。
- 編譯時期:參考的是引用型變量所屬的類中是否有調(diào)用的成員咳短。
- 運行時期:也是參考引用型變量所屬的類中是否有調(diào)用的成員填帽。
為什么是這樣的呢?因為靜態(tài)方法咙好,其實不所屬于對象篡腌,而是所屬于該方法所在的類。
調(diào)用靜態(tài)的方法引用是哪個類的引用調(diào)用的就是哪個類中的靜態(tài)方法勾效。 - 簡單說:靜態(tài)函數(shù) --- 編譯運行都看 = 左邊.
看下面代碼:
public class PrivateOverride {
public int i = 10;//成員變量
private void f() {//私有成員函數(shù)
System.out.println("private f()");
}
public void g() {//成員函數(shù)
System.out.println("PrivateOverride g()");
}
public static void s() {//靜態(tài)函數(shù)
System.out.println("PrivateOverride s()");
}
public static void main(String[] args) {
PrivateOverride po = new Derived();
po.f();
po.g();
po.s();
System.out.println("i="+po.i);
((Derived)po).e();
}
}
class Derived extends PrivateOverride{
public int i = 20;
public void f() {
System.out.println("Derived f()");
}
public void g() {
System.out.println("Derived g()");
}
public void e() {
System.out.println("Derived e()");
}
public static void s() {
System.out.println("Derived s()");
}
}
運行結(jié)果:
private f()
Derived g()
PrivateOverride s()
i=10
Derived e()
上面有個f()方法基類是私有方法嘹悼,子類也有個公有的f()方法,執(zhí)行po.f();后层宫,結(jié)果是基類的f()方法調(diào)用杨伙,這是由于private方法被自動認(rèn)為是final方法,而對于子類是屏蔽的萌腿,因此缀台,在這種情況下,Derived類中的f()方法就是一個全新的方法哮奇,既然基類中的f()方法在子類Derived中不可見膛腐,因此甚至也不能被重載。
???結(jié)論就是:只有非private方法才可以被覆蓋鼎俘,但是還需要密切注意覆蓋private方法的現(xiàn)象哲身,這時雖然編譯器不會報錯,但是也不會按照我們所期望的來執(zhí)行贸伐。確切地說勘天,在基類中,對于基類中private方法捉邢,最好采用不同的名字脯丝。