Java?Object類和包裝類深入解讀
查看源代碼方法
在IDEA中雙擊 shift 鍵,可以搜索相關(guān)類名,查看源代碼


點(diǎn)擊Structure ,左側(cè)用橙色床框住的部分是類的結(jié)構(gòu),結(jié)構(gòu)包含所有的方法、屬性、內(nèi)部類的聲明。結(jié)構(gòu)中帶綠色小鎖的圖標(biāo)表示 public 權(quán)限,鑰匙圖標(biāo)就是繼承權(quán)限(protected),紅色鎖的圖標(biāo)就是 private 權(quán)限。右邊是源碼。
Object類
定義及應(yīng)用
Object類是所有類的默認(rèn)父類,不需要使用 extends 顯示繼承,因此 Object 類的所有方法(private 除外),所有類的對(duì)象都能使用。因此所有對(duì)象都可以通過(guò)Object來(lái)接收
示例:
Object obj1 = "test";
Object obj2 = new Student("小陳",18);
Object obj3 = 123;在Java中對(duì)Object類做了擴(kuò)充,使它不僅是所有類的父類,只要是引用數(shù)據(jù)類型,都可以向上轉(zhuǎn)型為Object類,包括數(shù)組和接口也就是說(shuō), Object 類是引用數(shù)據(jù)類型的最高參數(shù)統(tǒng)一化
接下來(lái)我們來(lái)了解Object類中兩個(gè)常用的方法
1. toString()
將任意對(duì)象轉(zhuǎn)為字符串輸出,打印對(duì)象內(nèi)容。System.out.println()接收任意對(duì)象并輸出,就是默認(rèn)調(diào)用的 toString方法
運(yùn)行下面代碼:
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);
}
}運(yùn)行結(jié)果:
![]()
可以看到不是我們預(yù)期的結(jié)果,為什么呢?我們來(lái)看看 toString() 的源碼

此時(shí)想要輸出具體內(nèi)容,就需要覆寫(xiě) toString()方法:
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}//輸出:Student{name='張三', age=17}
2. equals( )
比較兩個(gè)對(duì)象是否相等,通常比較屬性,承接上例,我們創(chuàng)建一個(gè)新對(duì)象和s1比較:
Student s1 = new Student("張三",17);
Student s2 = new Student("張三",17);
System.out.println(s1.equals(s2));
//輸出:false
s1和s2的名字和年齡都是相同的,為什么輸出結(jié)果為false呢?讓我們來(lái)看看equals方法的源碼

有 new 就有新對(duì)象,所以s1和s2顯然不是同一地址。此時(shí)Student類默認(rèn)使用的是Object類提供的equals方法,對(duì)于Object類而言,它不知道子類有哪些屬性 ,所以比較的是對(duì)象的地址。
如果我們想要比較屬性值就要覆寫(xiě)equals方法:
public boolean equals(Object obj){
//當(dāng)前對(duì)象和傳入的obj比較
//1.判斷 obj 是否為空
if (obj == null){
return false;
}
//2.判斷obj是否就是自己,就是地址相同
if (obj == this){
return true;
}
//3.判斷obj是否是該類的對(duì)象,比如傳入一個(gè)字符串,它不是Student類型,無(wú)法比
if (!(obj instanceof Object) ){
return false;
}
//4.此時(shí)obj一定是Student類的對(duì)象,而且兩個(gè)對(duì)象不是同一個(gè)地址
//向下轉(zhuǎn)型還原為Student,比較對(duì)象屬性
Student stu = (Student) obj;
return this.name.equals(stu.name)&& this.age == stu.age;
}
}equals方法的覆寫(xiě)非常重要!?。∫欢ㄒ莆?,代碼中應(yīng)用到的 instanceof 和 向下轉(zhuǎn)型的知識(shí)鏈接如下,感興趣的可以去看看哦
包裝類
定義及應(yīng)用
包裝類就是將8種數(shù)據(jù)類型封裝為類:
對(duì)象包裝類(Object雷的直接子類) | Boolean、Character |
數(shù)值型包裝類(Number類的直接子類) | Byte、Short、Integer、Long、Float、Double |
以 Integer 類為例應(yīng)用:
public static void main(String[] args) {
//將int -> 類
Integer data = new Integer(10);
//value就是將包裝類的內(nèi)容取出來(lái)
int a = data.intValue();
System.out.println(a);
}
//輸出:10
裝箱和拆箱
裝箱:將基本類型變?yōu)榘b類對(duì)象
拆箱:將包裝類對(duì)象中的數(shù)值還原為基本類型
在上述示例中:

在我們實(shí)際操作時(shí),反復(fù)的拆裝箱是很麻煩的,在Java中為我們提供了自動(dòng)裝箱、拆箱
代碼示例:
public static void main(String[] args) {
Integer a = 20;
int b = a+2;
System.out.println(b);
}
//輸出:22
可以看到,a是Integer類的對(duì)象,但它可以直接和整型數(shù)據(jù)做運(yùn)算,實(shí)際上, Integer a = 20;就是自動(dòng)裝箱, int b = a+2;就是自動(dòng)拆箱過(guò)程。所以在用法上,包裝類和基本類型沒(méi)有區(qū)別。但是一定要記住,基本數(shù)據(jù)類型的默認(rèn)值是0,包裝類的默認(rèn)值為null
那么我們什么時(shí)候使用包裝類,什么時(shí)候使用基本數(shù)據(jù)類型呢?阿里編碼規(guī)約做如下規(guī)定:
- 在類中定義成員變量,必須使用包裝類聲明
- 在方法中,大量進(jìn)行算術(shù)運(yùn)算使用基本類型
自己實(shí)現(xiàn)包裝類
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);
}
}
//輸出結(jié)果:11
通過(guò)包裝類讓Object類接收基本數(shù)據(jù)類型
我們已經(jīng)知道Object類可以接收所有引用類型,可遇到基本數(shù)據(jù)類型就行不通了,包裝類就完美解決了這一問(wèn)題。
使用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
包裝類的對(duì)象比較
統(tǒng)一使用 equals 方法
Integer a = 10;
Integer b =10;
System.out.println(a .equals(b) );
//輸出:true
包裝類和String的相互轉(zhuǎn)換
① 包裝類 --> String :使用String.valueOf()
② String --> 包裝類 :使用包裝類的parse***()
代碼實(shí)現(xiàn):
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);
}
//輸出結(jié)果:
200
123
注意String轉(zhuǎn)換時(shí)若字符串不是純數(shù)字組成,運(yùn)行時(shí)就是出現(xiàn)類型轉(zhuǎn)換異常。
到此這篇關(guān)于Java Object類和包裝類深入解讀的文章就介紹到這了,更多相關(guān)Java Object類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲(控制主飛機(jī)篇)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲,控制主飛機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
將java程序打成jar包在cmd命令行下執(zhí)行的方法
這篇文章主要給大家介紹了關(guān)于將java程序打成jar包在cmd命令行下執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
學(xué)習(xí)Java模擬實(shí)現(xiàn)百度文檔在線瀏覽
這片文章介紹了如何使用Java模擬實(shí)現(xiàn)百度文檔在線瀏覽,文章思路清晰,需要的朋友可以參考下2015-07-07
ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法
ThreadLocal 的內(nèi)存泄漏問(wèn)題通常發(fā)生在使用 ThreadLocal 存儲(chǔ)對(duì)象時(shí),尤其是在多線程環(huán)境中,線程池中的線程復(fù)用可能導(dǎo)致一些資源沒(méi)有及時(shí)清理,從而引發(fā)內(nèi)存泄漏,所以本文給大家介紹了ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法,需要的朋友可以參考下2024-12-12
JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

