一句話:父類引用指向子類對象java
格式: 父類名稱 對象名 = new 子類名稱()
或者
接口名稱 對象名 = new 實現類名稱()安全
public class Fu { public void main() { System.out.println("父類方法"); } public void mainTest() { System.out.println("父類特殊方法"); } } public class Zi extends Fu{ @Override public void main() { System.out.println("子類方法"); } } public class Mulituplate { public static void main(String[] args) { Fu objFu = new Zi(); objFu.main(); objFu.mainTest(); } }
訪問成員變量:
直接經過對象名稱訪問成員變量,誰是對象,優先使用誰,沒有則向上找。
間接經過方法訪問成員變量,方法屬於誰,則優先使用誰,沒有則向上找。
重寫了父類方法,就是50,不重寫就是20。ide
public class Fu { int num = 20; public void main() { System.out.println("父類方法"); } public void mainTest() { System.out.println("父類特殊方法"); } } public class Zi extends Fu{ int num = 50; @Override public void main() { System.out.println("子類方法"); } } //調用 public class Mulituplate { public static void main(String[] args) { Fu obj = new Zi(); obj.main(); obj.mainTest(); System.out.println(obj.num); // 20 } }
訪問成員方法:
看new的是誰,就優先用誰,沒有則向上找。可是沒法訪問子類特有的成員。3d
使用多態的好處:使左邊的代碼更加簡單。無需修改
code
對象的向上轉型:(多態)對象
父類引用指向子類對象。blog
對象的向下轉型:
向上轉型是安全的,可是沒法訪問子類特有的成員方法
接口
對象的向下轉型必定要進行類型instanceof判斷it
if (obj instanceof Fu) { Zi zi = (Zi)obj; zi.mianZi(); }