向上轉型java
class father { public void eat(){ System.out.println("father eat()"); } } class son extends father { public void sleep(){ System.out.println("son sleep()"); } public void eat(){ System.out.println("son eat()"); } } public class test1 { public static void main(String[] args) { father f = new son();//向上轉型 f.eat(); //f.sleep() f雖然也指向了son對象,可是向上轉型的代價是會丟丟失與父類不一樣的方法 } }
向上轉型的好處編程
這樣使代碼變得簡潔。體現了JAVA的抽象編程思想。安全
向下轉型spa
class father { public void eat(){ System.out.println("father eat()"); } } class son extends father { public void sleep(){ System.out.println("son sleep()"); } public void eat(){ System.out.println("son eat()"); } } public class test1 { public static void main(String[] args) { father f = new son();//向上轉型 f.eat(); //f.sleep() f雖然也指向了son對象,可是向上轉型的代價是會丟丟失與父類不一樣的方法 son s = (son)f;//向下轉型 s.eat(); s.sleep(); /* * 這種方法運行的時候會報錯 father fa = new father(); son so = (son)fa; so.eat(); so.sleep(); */ } }
Java爲了解決不安全的向下轉型問題,引入泛型的概念code
爲了安全的類型轉換,最好先用 if(A instanceof B) 判斷一下對象
總結blog
一、父類引用能夠指向子類對象,子類引用不能指向父類對象。ast
二、把子類對象直接賦給父類引用叫upcasting向上轉型,向上轉型不用強制轉型。class
如Father father = new Son();test
三、把指向子類對象的父類引用賦給子類引用叫向下轉型(downcasting),要強制轉型。
如father就是一個指向子類對象的父類引用,把father賦給子類引用son 即Son son =(Son)father;
其中father前面的(Son)必須添加,進行強制轉換。
四、upcasting 會丟失子類特有的方法,可是子類overriding 父類的方法,子類方法有效
五、向上轉型的做用,減小重複代碼,父類爲參數,調有時用子類做爲參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象編程思想。