Java Object類和包裝類深入解讀
查看源代碼方法
在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類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java如何重寫object類的equals方法詳解
- Java基礎之Object類詳解
- 一文帶你瞭解Java中的Object類及類中方法
- java中Object類4種方法詳細介紹
- Java中如何正確重寫equals方法