首頁 > 軟體

Java Object類和包裝類深入解讀

2022-02-13 10:00:37

檢視原始碼方法

在IDEA中雙擊 shift 鍵,可以搜尋相關類名,檢視原始碼

點選Structure ,左側用橙色床框住的部分是類的結構,結構包含所有的方法、屬性、內部類的宣告。結構中帶綠色小鎖的圖示表示 public 許可權,鑰匙圖示就是繼承許可權(protected),紅色鎖的圖示就是 private 許可權。右邊是原始碼。

Object類

定義及應用

Object類是所有類的預設父類別,不需要使用 extends 顯示繼承,因此 Object 類的所有方法(private 除外),所有類的物件都能使用。因此所有物件都可以通過Object來接收

範例:

        Object obj1 = "test";
        Object obj2 = new Student("小陳",18);
        Object obj3 = 123;

在Java中對Object類做了擴充,使它不僅是所有類的父類別,只要是參照資料型別,都可以向上轉型為Object類,包括陣列和介面也就是說, Object 類是參照資料型別的最高引數統一化

接下來我們來了解Object類中兩個常用的方法

1. toString()

將任意物件轉為字串輸出,列印物件內容。System.out.println()接收任意物件並輸出,就是預設呼叫的 toString方法

執行下面程式碼:

class Student{
    private String name;
    private int age;
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public class ObjectTest {
    public static void main(String[] args) {
        Student s1 = new Student("張三",17);
        System.out.println(s1);
    }
}

執行結果:

可以看到不是我們預期的結果,為什麼呢?我們來看看 toString() 的原始碼

此時想要輸出具體內容,就需要覆寫 toString()方法:

 public String toString() {
        return "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

//輸出:Student{name='張三', age=17}

2. equals( )

比較兩個物件是否相等,通常比較屬性,承接上例,我們建立一個新物件和s1比較:

        Student s1 = new Student("張三",17);
        Student s2 = new Student("張三",17);
        System.out.println(s1.equals(s2));

//輸出:false

s1和s2的名字和年齡都是相同的,為什麼輸出結果為false呢?讓我們來看看equals方法的原始碼

有 new 就有新物件,所以s1和s2顯然不是同一地址。此時Student類預設使用的是Object類提供的equals方法,對於Object類而言,它不知道子類有哪些屬性 ,所以比較的是物件的地址。

如果我們想要比較屬性值就要覆寫equals方法:

  public boolean equals(Object obj){
        //當前物件和傳入的obj比較
        //1.判斷 obj 是否為空
        if (obj == null){
            return false;
        }
        //2.判斷obj是否就是自己,就是地址相同
        if (obj == this){
            return true;
        }
        //3.判斷obj是否是該類的物件,比如傳入一個字串,它不是Student型別,無法比
        if (!(obj instanceof Object) ){
            return false;
        }
        //4.此時obj一定是Student類的物件,而且兩個物件不是同一個地址
        //向下轉型還原為Student,比較物件屬性
        Student stu = (Student) obj;
        return this.name.equals(stu.name)&& this.age == stu.age;
    }
}

equals方法的覆寫非常重要!!!一定要掌握,程式碼中應用到的 instanceof 和 向下轉型的知識連結如下,感興趣的可以去看看哦

詳解Java物件導向程式設計之多型

包裝類

定義及應用

包裝類就是將8種資料型別封裝為類:

物件包裝類(Object雷的直接子類)

Boolean、Character

數值型包裝類(Number類的直接子類)

Byte、Short、Integer、Long、Float、Double

以 Integer  類為例應用:

 public static void main(String[] args) {
        //將int -> 類
        Integer data = new Integer(10);
        //value就是將包裝類的內容取出來
        int a = data.intValue();
        System.out.println(a);
    }

  //輸出:10

裝箱和拆箱

裝箱:將基本型別變為包裝類物件

拆箱:將包裝類物件中的數值還原為基本型別

在上述範例中:

在我們實際操作時,反覆的拆裝箱是很麻煩的,在Java中為我們提供了自動裝箱、拆箱

程式碼範例:

    public static void main(String[] args) {
        Integer a = 20;
        int b = a+2;
        System.out.println(b);
    }

//輸出:22

可以看到,a是Integer類的物件,但它可以直接和整型資料做運算,實際上,   Integer a = 20;就是自動裝箱, int b = a+2;就是自動拆箱過程。所以在用法上,包裝類和基本型別沒有區別。但是一定要記住,基本資料型別的預設值是0,包裝類的預設值為null

那麼我們什麼時候使用包裝類,什麼時候使用基本資料型別呢?阿里編碼規約做如下規定:

  • 在類中定義成員變數,必須使用包裝類宣告
  • 在方法中,大量進行算術運算使用基本型別

自己實現包裝類

public class IntDemo {
    //儲存具體的整型值
    private int data;
    public IntDemo(int data){
        this.data = data;
    }
    public int intValue(){
        return this.data;
    }
 
    public static void main(String[] args) {
        //將int -> 類
        IntDemo demo = new IntDemo(10);
        int data = demo.intValue();
        System.out.println(data+1);
    }
}

//輸出結果:11

通過包裝類讓Object類接收基本資料型別

我們已經知道Object類可以接收所有參照型別,可遇到基本資料型別就行不通了,包裝類就完美解決了這一問題。 

使用Object類接收,將上例的主方法做如下修改:

    public static void main(String[] args) {
        //將int -> 類
        IntDemo demo = new IntDemo(10);
        Object obj = demo;
        IntDemo demo1 = (IntDemo) obj;
        int data = demo1.intValue();
        System.out.println(data+1);
    }

//輸出:11

包裝類的物件比較

統一使用 equals 方法

        Integer a = 10;
        Integer b =10;
        System.out.println(a .equals(b) );

//輸出:true

包裝類和String的相互轉換

① 包裝類 --> String :使用String.valueOf()

② String --> 包裝類 :使用包裝類的parse***()

程式碼實現:

      public static void main(String[] args) {
        //Integer -> String
       Integer x = new  Integer(200);
        String y = String.valueOf(x);
        System.out.println(y);
 
        //String-> Integer
        String str ="123";
        Integer a = Integer.parseInt(str);
        System.out.println(a);
      }

//輸出結果:
          200
          123

注意String轉換時若字串不是純數位組成,執行時就是出現型別轉換異常。

到此這篇關於Java Object類和包裝類深入解讀的文章就介紹到這了,更多相關Java Object類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com