1. 程式人生 > 實用技巧 >2020年8月13日 向上轉型、向下轉型UpCasting,DownCasting(出題點)

2020年8月13日 向上轉型、向下轉型UpCasting,DownCasting(出題點)

/*
 * 資料型別的轉換:
 *     1、基本資料型別的轉換
 * (1)自動型別轉換
 * byte->short->int->long->float->double
 *           char->
 * boolean不參與
 * (2)強制型別轉換
 * double->float->long->int->short->byte
 *                            ->char
 * 
 * 2、引用資料型別資料
 * 父子類之間的轉換:編譯期間
 * (1)向上轉型(UpCasting):從子類-》父類
* 把子類的物件賦值給父類的變數時 * (2)向下轉型(DownCasting):從父類-》子類 * 把父類的變數賦值給子類的變數時 * * 為什麼要向上轉型? * 因為多型陣列、多型引數的應用場景,使得有的時候,不得不向上轉型,這是為了方便統一管理各種子類的物件。 * 為什麼又需要向下轉型呢? * 向下轉型的目的是為了呼叫子類特有的方法等 * * 是不是隨意的父類的變數,向下轉型都會成功呢? * 不是 * 要想轉型成功,必須之前是向上轉型的,才能向下轉型成功。 * 或者說,要想轉型成功,必須保證該變數中儲存的物件的執行時型別是<=強轉的型別 * 例如: * Person p = new Woman();//向上轉型 * //向下轉型 * Woman m = (Woman)p; p變數中實際儲存的物件就是Woman型別,和強轉的Woman型別一樣 * * Person p4 = new ChineseWoman();//向上轉型 * //向下轉型 Woman w4 = (Woman) p4; p4變數中實際儲存的物件是ChineseWoman型別,強制的型別是Woman,ChineseWoman<Woman型別 * * * 回憶: * (1)ArrayIndexOutOfBoundsException:陣列下標越界異常
* 下標超過了[0,長度-1] * (2)NullPointerException:空指標異常 * 物件.屬性 * 物件.方法 * 如果物件是null,就會發生空指標異常 *  (3)ClassCastException:型別轉換異常 * 在向下轉型時,可能會發生
* * 請列出至少5個常見異常型別?(面試題) */
package com.atguigu.test04.cast;


public class TestCasting {
    public static void main(String[] args) {
        
//(1)向上轉型 Person p = new Woman();//多型引用 //一旦把Woman物件向上轉型為Person型別後,就只能呼叫父類有的方法 p.eat(); p.walk(); //(2)向下轉型 //想要在這裡呼叫Woman特有的方法時 //編譯時,p是Person型別,那麼編譯不通過 //因為在Java中,認為父類的概念範圍>子類的概念範圍 // long num = 1L; // int i = (int)num; // Woman m = p;//編譯報錯 Woman m = (Woman)p; m.shop(); //Person p2 = new Person(); //Woman w2 = (Woman) p2;//ClassCastException:型別轉換異常 //w2.shop(); // Person p3 = new Man(); // Woman w3 = (Woman) p3;//ClassCastException:型別轉換異常 // w3.shop(); Person p4 = new ChineseWoman(); Woman w4 = (Woman) p4; w4.shop(); //不是父子類之間是不能進行向上與向下轉型的 // Person p5 = "hello"; // Person p6 = (Person)"hello"; } } class Person{ public void eat(){ System.out.println("吃飯"); } public void walk(){ System.out.println("走路"); } } class Woman extends Person{ public void eat(){ System.out.println("細嚼慢嚥的吃飯"); } public void walk(){ System.out.println("婀娜多姿走路"); } public void shop(){ System.out.println("買買買..."); } } class ChineseWoman extends Woman{ } class Man extends Person{ public void eat(){ System.out.println("狼吞虎嚥的吃飯"); } public void walk(){ System.out.println("大搖大擺的走路"); } public void smoke(){ System.out.println("吞雲吐霧"); } }