java向上轉型和向下轉型

來源:互聯網
上載者:User

標籤:

轉型是在繼承的基礎上而言的,繼承是物件導向語言中,代碼複用的一種機制,通過繼承,子類可以複用父類的功能,如果父類不能滿足當前子類的需求,則子類可以重寫父類中的方法來加以擴充。

向上轉型:子類引用的對象轉換為父類類型稱為向上轉型。通俗地說就是是將子類對象轉為父類對象。此處父類對象可以是介面

向下轉型:父類引用的對象轉換為子類類型稱為向下轉型。

前者是一個向上轉型,Animal dog 引用指向new Dog();子類對象當成父類對象,只能調用父類的成員,如果子類重寫了父類的方法就根據這個引用指向調用子類重寫的這個方法(這個方法就是覆蓋override)。這個調用過程就稱為“動態綁定”。

轉型需要注意的問題:

向上轉型時,父類指向子類引用對象會遺失除與父類對象共有的其他方法,也就是在轉型過程中,子類的新有的方法都會遺失掉,在編譯時間,系統會提供找不到方法的錯誤。執行個體如下:

 1 package com.hh.Object; 2  3 class Animal { 4  5     public void eat() { 6  7         System.out.println("animal eatting..."); 8  9     }10 11 }12 13 class Bird extends Animal {14 15     public void eat() {16 17         System.out.println("bird eatting...");18 19     }20 21     public void fly() {22 23         System.out.println("bird flying...");24 25     }26 27 }28 29 public class Main {30 31     public static void main(String[] args) {32 33         Animal b = new Bird(); // 向上轉型34 35         b.eat();36 37         b.fly(); // 此處提示在Animal中沒有定義fly方法。38     }39 }
View Code

 

在向下轉型過程中,分為兩種情況:

情況一:如果父類引用的對象如果引用的是指向的子類對象,那麼在向下轉型的過程中是安全的。也就是編譯是不會出錯誤的。

情況二:如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤。執行個體如下:

 1 package com.hh.Object; 2  3 class Girl { 4     public void smile() { 5         System.out.println("girl smile()..."); 6     } 7 } 8  9 class MMGirl extends Girl {10     @Override11     public void smile() {12         System.out.println("MMirl smile sounds sweet...");13     }14 15     public void c() {16         System.out.println("MMirl c()...");17     }18 }19 20 public class Main1 {21 22     public static void main(String[] args) {23         Girl g1 = new MMGirl(); // 向上轉型24         g1.smile();25         MMGirl mmg = (MMGirl) g1; // 向下轉型,編譯和運行皆不會出錯26         mmg.smile();27         mmg.c();28         Girl g2 = new Girl();29         30         // MMGirl mmg1 = (MMGirl) g2; // 不安全的向下轉型,編譯無錯但會運行會出錯31         // mmg1.smile();32         // mmg1.c();33         34         if (g2 instanceof MMGirl) {35             MMGirl mmg1 = (MMGirl) g2;36             mmg1.smile();37             mmg1.c();38         }39 40     }41 }
View Code

總結:

1、父類引用可以指向子類對象,子類引用不能指向父類對象。

2、把子類對象直接賦給父類引用叫upcasting向上轉型,向上轉型不用強制轉型。

   如Father father = new Son();

3、把指向子類對象的父類引用賦給子類引用叫向下轉型(downcasting),要強制轉型。

   如father就是一個指向子類對象的父類引用,把father賦給子類引用son 即Son son =(Son)father;

   其中father前面的(Son)必須添加,進行強制轉換。

4、upcasting 會丟失子類特有的方法,但是子類Override 父類的方法,子類方法有效

5、向上轉型的作用,減少重複代碼,父類為參數,調有時用子類作為參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象編程思想。

java向上轉型和向下轉型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.