多型~

kevin.jiu發表於2020-09-24

理解多型性:一個事物的多種形態
何為多型性:物件的多型性-------->父類的引用指向子類的物件

多型的使用:即虛擬方法呼叫
有了物件的多型性後,我們在編譯期,只能呼叫父類中宣告的方法,但在執行期,我們實際執行的是子類重寫父類的方法。

多型性的使用前提:類的繼承關係、子類重寫了父類的方法

物件的多型性只適用於方法,不適用於屬性

為什麼使用向下轉型:
有了物件的多型性後,記憶體中實際上是載入了子類特有的屬性和方法的,但是由於變數宣告為父類型別,導致編譯時,只能呼叫父類中宣告的屬性和方法。子類特有的屬性和方法不能呼叫。這時使用強制型別轉換符實現向下轉型

a instanceof A : 判斷物件a是否是類A的例項。如果是,返回true,如果不是,返回false
使用場景:為了避免在向下轉型時出現ClassCastException的異常,我們在向下轉型之前,先進行instanceof的判斷,
一旦返回true,就向下轉型。如果返回false,則不向下轉型。

== 和 equals方法的區別:
==:運算子
1、可以使用在基本資料型別變數和引用資料型別變數中
2、如果比較的是基本資料型別變數:比較兩個變數儲存的資料是否相等(不一定要型別相同)
如果比較的是引用資料型別變數:比較兩個物件的地址值是否相同,即兩個引用是否指向同一個物件實體

equals()方法的使用:
1、是一個方法,而非運算子
2、只能適用於引用資料型別
3、Object類中定義的equals()和 == 作用是相同的,比較的是地址值是否相同
4、像String 、Data 、File、包裝類等都重寫了Object類中的equals()方法。重寫以後,比較的不是兩個引用的地址是否
相同,而是比較兩個物件的實體內容是否相同。
5、通常情況下:我們自定義的類如果使用的equals()方法的話,,也通常是比較兩個物件的實體內容是否相同。那麼我們就需要對Object類的equals()方法進行重寫。

包裝類的使用:
java提供了8種基本資料型別對應的包裝類,使得基本資料型別的變數具有類的特徵

總結:
Java5.0以前:
基本資料型別---->包裝類:呼叫包裝類的構造器

eg:           int num1 = 10;
       Integer in1 = new Integer(num1);
       System.out.println(in1.toString());

包裝類---->基本資料型別:呼叫包裝類的xxxValue()方法

eg:           Integer in1 = new Integer(12);
       int  i1 = in1.intValue();
       System.out.println(i1 + 1);

Java5.0新特性以後:
基本資料型別---->包裝類:即自動裝箱

eg:           int num2 = 10;
       Integer in1 = num2;

包裝類---->基本資料型別:即自動拆箱

eg:           int num3 = in1;

到了Java5.0以後,就不加區分的在基本資料型別和包裝類中互相轉換
基本資料型別、包裝類----->String型別:呼叫String過載的valueOf( )方法

eg:           float f1 = 12.3f;
       String str2 = String.valueOf(f1);
       
       Double d1 = new Double(12.4);
       String str3 = String.valueOf(d1);

String型別----->基本資料型別、包裝類:呼叫包裝類的parseXxx(String s)方法

eg:           String str1 = "123";
       int num1 = Integer.parseInt(str1);
       System.out.println(num1 + 1);
       
       String str2 = "true";
       boolean b1 = Boolean.parseBoolean(str2);
       System.out.println(b1);