java之 向上轉型與向下轉型
阿新 • • 發佈:2018-11-06
向上轉型
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的抽象程式設計思想。
向下轉型
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為了解決不安全的向下轉型問題,引入泛型的概念
為了安全的型別轉換,最好先用 if(A instanceof B) 判斷一下
總結
1、父類引用可以指向子類物件,子類引用不能指向父類物件。
2、把子類物件直接賦給父類引用叫upcasting向上轉型,向上轉型不用強制轉型。
如Father father = new Son();
3、把指向子類物件的父類引用賦給子類引用叫向下轉型(downcasting),要強制轉型。
如father就是一個指向子類物件的父類引用,把father賦給子類引用son 即Son son =(Son)father;
其中father前面的(Son)必須新增,進行強制轉換。
4、upcasting 會丟失子類特有的方法,但是子類overriding 父類的方法,子類方法有效
5、向上轉型的作用,減少重複程式碼,父類為引數,調有時用子類作為引數,就是利用了向上轉型。這樣使程式碼變得簡潔。體現了JAVA的抽象程式設計思想。