在java繼承體系中,認為父類(超類)在上層,子類在下層(派生類) ,向上轉型就是把子類對象轉成父類對象。
1 public class Father { 2 public void eat(){ 3 System.out.println("我是父類的方法吃。。。。。"); 4 } 5 }
1 public class Son extends Father{ 2 3 public void eat(){ 4 System.out.println("我是Son的方法吃。。。。。"); 5 } 6 public void sleep(){ 7 System.out.println("Son睡覺"); 8 } 9 }
測試
1 public static void main(String[] args) { 2 Father f=new Son();//子類向上轉型 3 Person p=new Son();//普通的new 4 f.eat(); 5 //f.sleep();無法調用此方法 此方法不存在 6 p.eat(); 7 p.sleep(); 8 9 10 } 11 運行結果: 我是子類的方法吃 12 我是子類的方法吃 13 睡覺
此處無法調用f.sleep() ,就是向上轉型之后會失去父類中沒有定義的方法,只能調用父類中定義的方法。那到底 向上轉型有什么用處那 為何不直接那子類自己定義的對象直接調用?
如果直接new Son() 打點調用也可以 這樣就沒有體現出面向對象的抽象的編程思想,而且 代碼的可擴展性差。
若果該父類還有一個子類Son1
1 public class Son1 extends Father { 2 public void eat(){ 3 System.out.println("son1 的eat方法"); 4 } 5 public void sleep(){ 6 System.out.println("son1 的sleep方法"); 7 } 8 9 }
看下邊測試代碼
1 public class Test { 2 public static void main(String[] args) { 3 4 tt(new Son()); 5 tt(new Son1()); 6 } 7 8 9 public static void tt(Son son){ 10 11 son.eat(); 12 } 13 public static void tt(Son1 son){ 14 15 son.eat(); 16 } 17 18 }
我的tt方法 中需要調用 各個子類的一些或所有方法,代碼如上所示,假若我有很多個子類 這樣 代碼就顯的特別沉於 重復率太高
向上轉型就可以完美的解決此類問題:無論我有多少個子類都可以 一個方法搞定。。
1 public class Test { 2 public static void main(String[] args) { 3 4 tt(new Son()); 5 tt(new Son1()); 6 } 7 8 9 public static void tt(Father son){ 10 //父類對象當做實例化參數 11 son.eat(); 12 } 13 }
