多態中,成員特色
1.成員變量(編譯運行全看父類):
編譯的時候, 參考父類中有沒有這個變量,若是有,編譯成功,沒有編譯失敗
運行的時候, 運行的是父類中的變量值
2.成員方法( 編譯看父類,運行看子類):
編譯的時候, 參考父類中有沒有這個方法,若是有,編譯成功,沒有編譯失敗
運行的時候, 運行的是子類的重寫方法java
特例:調用靜態成員方法時,運行看父類。緣由:靜態屬於類,不屬於對象。不new對象,也可調用父類的靜態方法,直接用類名調用。測試
父類spa
package Static_user; public class Fu { int a = 1; static int b = 1;//靜態變量 public void show1(){ System.out.println("父類的方法show1"); } //靜態方法 public static void show2(){ System.out.println("父類的靜態方法show2"); } }
子類code
package Static_user; public class Zi extends Fu { int a = 2; static int b = 2;//靜態變量 public void show1 (){ System.out.println("子類的方法show1"); } //靜態方法 public static void show2(){ System.out.println("子類的靜態方法show2"); } }
測試類對象
package Static_user; /* * 多態運行中,編譯看誰,運行看誰 * 編譯都看 = (等號)左邊的父類,父類又編譯成功,沒有編譯失敗 * 運行時,成員變量,運行的全是父類的 * 運行時,靜態方法,運行父類的靜態方法 * 運行時,非靜態方法,運行子類的重寫方法 * */ public class Test { public static void main(String[] args) { Fu f = new Zi(); System.out.println("a="+f.a); f.show1(); System.out.println("b="+f.b); /* * 調用的仍是父類的靜態方法 * 緣由:靜態屬於類,不屬於對象。不new對象,也可調用父類的靜態方法,直接用類名調用 * 對象的多態性,靜態與對象無關 */ f.show2(); } }
運行結果:編譯
a=1 子類的方法show1 b=1 父類的靜態方法show2