示例代碼
class fu
{
void show()
{
System.out.println("父類...run ! ");
}
}
class zi extends fu
{
void show()
{
System.out.println("子類...run ! ");
}
}
1、成員函數(非靜態)——(存在動態綁定的特點)
編譯時:要查看引用變量所屬的類中是否有所調用的成員
運行時:要查看對象所屬的類中是否有所調用的成員
eg:
//前提:zi和fu中都有show方法
fu f=new zi();
f.show();
輸出的是zi中的show方法,但是在編譯的時候是查看fu中的show方法。
簡單來說,編譯時看等號左邊,輸出結果(運行時)看等號的右邊。
動態綁定:
fu f=new zi();中f對應的是zi對象的地址,所以是輸出zi中的show函數(show方法不是靜態函數,所以該方法的存在依靠着對象而存在)
2、成員變量
只查看引用變量所屬的類中是否有所調用的成員變量
eg:
fu f=new zi();
此時,zi已經向上轉型成爲了fu,所以調用的是fu中的變量
簡單來說,就是看等號的左邊
3、靜態函數
eg:
//前提:zi和fu中都有show方法
fu f=new zi();
f.show();
輸出fu中show方法
解釋:靜態方法是不依賴與對象而存在的。類一加載靜態方法就存在了,所以fu中的show與fu從一開始就綁定在一起,而zi中的show與zi也從一開始就綁定在一起,所以調用的時候就依賴於誰調用,所以用f調用時,對應fu中的show方法。
也可以理解爲——靜態就不涉及多態,因爲多態是相對於對象而存在的,但是靜態是不依賴於對象的,所以靜態不涉及多態。
簡單來說,編譯和運行都看等號左邊。