Java的Object類

導(dǎo)語

俗話說得好:萬物皆對象。既然這樣楚殿,你為什么沒有對象呢撮慨。

主要內(nèi)容

  • Object類的作用
  • Object類的常用方法
  • Object類接收引用數(shù)據(jù)類型

具體內(nèi)容

現(xiàn)在有對象、數(shù)組、接口砌溺,那么這么多數(shù)據(jù)怎么能夠進行統(tǒng)一呢?于是就有了Object類的設(shè)計规伐。

Object類的基本定義

Object類是所有類的父類,也就是說任何一個類的定義的時候如果沒有明確的繼承一個父類的話喊式,那么它就是Object的子類萧朝,也就是說以下兩種類的定義的最終效果是完全相同的。

class Book {
    
}
class Book extends Object {
    
}

在整個Java里面類的繼承關(guān)系一直存在(除了Object類之外)检柬。
既然Object是所有類的父類,那么最大的一個好處就在于:利用Object類可以接收全部類的對象何址,因為向上自動轉(zhuǎn)型。

范例:利用Object類來接收對象

class Book extends Object {}

public class TestDemo {
    public static void main(String args[]){
        Object objA = new Book();  // 向上轉(zhuǎn)型
        Object objB = "hello";  // 向上轉(zhuǎn)型
        Book b = (Book) objA;
        String s = (String) objB;
    }
}

既然這樣原押,如果在不確定參數(shù)類型的時候偎血,使用Object類型應(yīng)該是最好的選擇。

問題:為什么在Object類里要定義一個無參構(gòu)造方法呢颇玷?
既然Object類是所有類的父類 ,那么所有類的對象實例化的時候谒亦,了類構(gòu)造方法一定要默認調(diào)用父類的無參構(gòu)造空郊。

從嚴格意義上來講(一般不遵守),任何一個簡單Java類都應(yīng)該覆寫Object類中的如下三個方法:

  • 取得對象信息:public String toString()脾还。
  • 對象比較:public boolean equals(Object obj)。
  • 取得對象HASH碼:public hashCode()入愧。

取得對象信息:toString()

如果說現(xiàn)在是一個String類對象,直接輸出這個對象可以取得字符串的怔蚌,但是如果是一個自定義的對象旁赊,那么發(fā)現(xiàn)就會出現(xiàn)一個對象編碼。

范例:觀察代碼

class Book extends Object {}

public class TestDemo{
    public static void main(String args[]) {
        Book b = new Book();
        String s = "Hello";
        System.out.println(b);
        System.out.println(b.toString());
        System.out.println(s);
    }
}

輸出結(jié)果:

Book@659e0bfd
Book@659e0bfd
Hello

發(fā)現(xiàn)現(xiàn)在如果直接輸出對象與調(diào)用toString()方法后輸出對象的功能是完全一樣的籍胯。
在進行對象輸出的時候离福,輸出操作會自動調(diào)用對象中的toString()方法,將對象變?yōu)樽址笤佥敵鲅J情況下Object類中的toString()為了適應(yīng)所有對象的輸出,所以只輸出了對象的編碼绿聘。
如果現(xiàn)在有需要次舌,也可以自己根據(jù)實際情況來覆寫此方法。

范例:覆寫toString()方法

class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    public String toString() {
        return "書名:" + this.title + "價格:" + this.price;
    }
}

public class TestDemo {
    public static void main(String args[]){
        Book b = new Book("Java開發(fā)", 79.8);
        System.out.println(b);
        System.out.println(b.toString());
    }
}

輸出結(jié)果:

書名:Java開發(fā)價格:79.8
書名:Java開發(fā)價格:79.8

直接輸出對象就調(diào)用了toString()挪圾,等于輸出對象的時候代碼又節(jié)約了国拇。

對象比較:equals();

對象比較在很多的開發(fā)中都是一定要使用到的核心概念。

范例:覆寫equals()方法

class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Book)) {  // 如果不是本類實例返回false
            return  false;
        }
        Book book = (Book) obj;
        if (this.title.equals(book.title) 
            && this.price == book.price) {
            return true;        
        }
        return false;
    }
    public String toString() {
        return "書名:" + this.title + "價格:" + this.price;
    }
}

public class TestDemo {
    public static void main(String args[]){
        Book b1 = new Book("Java開發(fā)", 79.8);
        Book b2 = new Book("Java開發(fā)", 79.8);
        System.out.println(b1.equals(b2));
        System.out.println(b1.equals("Hello"));
    }
}

輸出結(jié)果:

true
false

對象的比較操作寫出以上的代碼應(yīng)該就算是完整了也殖。

Object類可以接收一切引用數(shù)據(jù)類型

Object類是所有類的父類务热,所以O(shè)bject類的對象可以接收所有類的對象,可是除了類的對象之外崎岂,Object類連數(shù)組和接口對象也都可以接收。

范例:接收數(shù)組數(shù)據(jù)

public class TestDemo {
    public static void main(String args[]) {
        Object obj = new int [] {1, 2, 3};  // 向上轉(zhuǎn)型
        System.out.println(obj);
        if (obj instanceof int[]) {
            int data [] = (int[]) obj;
            for (int i = 0; i < data.length; i++) {
                System.out.println(data[i]);
            }
        }
    }
}

輸出結(jié)果:

[I@659e0bfd
1
2
3

除了數(shù)組外绩卤,接口也同樣可以。

范例:接收接口對象

interface A {
    public void fun();
}

class B implements A {
    public void fun() {
        System.out.println("Hello World !");
    }
}

public class TestDemo {
    public static void main(String args[]) {
        A a = new B();  // 接口對象
        Object obj = a;  // 接收接口對象
        A t = (A) obj;
        t.fun();
    }
}

輸出結(jié)果:

Hello World !

整個程序的參數(shù)就統(tǒng)一在Object類型上何暇。

總結(jié)

  • Object類對象可以接收一切的數(shù)據(jù)類型(引用數(shù)據(jù)類型)凛驮,包括數(shù)組和接口,解決數(shù)據(jù)統(tǒng)一問題宏胯。
  • toString()在對象直接輸出時調(diào)用本姥,equals()在對象比較時調(diào)用。

更多內(nèi)容戳這里(整理好的各種文集)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末了牛,一起剝皮案震驚了整個濱河市辰妙,隨后出現(xiàn)的幾起案子鹰祸,更是在濱河造成了極大的恐慌,老刑警劉巖蛙婴,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尔破,死亡現(xiàn)場離奇詭異,居然都是意外死亡餐济,警方通過查閱死者的電腦和手機胆剧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙悯,“玉大人铃绒,你說我怎么就攤上這事〉咝” “怎么了定血?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵糠悼,是天一觀的道長。 經(jīng)常有香客問我,道長铝条,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任贤壁,我火速辦了婚禮埠忘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘名船。我一直安慰自己旨怠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布迷扇。 她就那樣靜靜地躺著爽哎,像睡著了一般蜓席。 火紅的嫁衣襯著肌膚如雪课锌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天隘庄,我揣著相機與錄音癣亚,去河邊找鬼。 笑死述雾,一個胖子當(dāng)著我的面吹牛兼丰,可吹牛的內(nèi)容都是我干的唆缴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼艳丛,長吁一口氣:“原來是場噩夢啊……” “哼趟紊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霎匈,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铛嘱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墨吓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡谐丢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年乾忱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄瘟。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡趟卸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锄列,到底是詐尸還是另有隱情,我是刑警寧澤竣况,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布筒严,位于F島的核電站情萤,受9級特大地震影響摹恨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晒哄,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一揩晴、第九天 我趴在偏房一處隱蔽的房頂上張望勋陪。 院中可真熱鬧硫兰,春花似錦寒锚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拣技,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膏斤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工傲茄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沮榜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓草巡,卻偏偏與公主長得像振愿,于是被迫代替她去往敵國和親弛饭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法枪孩,內(nèi)部類的語法,繼承相關(guān)的語法蔑舞,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法从撼,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,227評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程钧栖。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,057評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理掏婶,服務(wù)發(fā)現(xiàn)潭陪,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 我有功于人不可念老厌,而過則不可不念誓沸;人有恩于我不可忘梅桩,而怨則不可不忘拜隧。 奢者富而不足,何如儉者貧而有余洪添;能者勞而伏怨...
    HedyWang1閱讀 111評論 0 0