2020-05-11

Object類和異常

1、Object類

1.1Object類概述

????面向?qū)ο笳Z(yǔ)言中都會(huì)有一個(gè)類是作為所有類的基類,萬(wàn)物之根本?。。bject是Java中所有類的基類,根類。Object類是任何一個(gè)類的直接父類或者間接父類。

????Object提供了一些可以讓任何一個(gè)Java中類型使用的方法

????????toString方法

????????equals方法

????????hashCode方法

????還存在一些和線程相關(guān)的方法:

????????wait();

????????notify();

????????notifyAll();

????Object作為一種數(shù)據(jù)類型,如果按照J(rèn)ava數(shù)據(jù)類型規(guī)范

????????一個(gè)方法需要的參數(shù)是Object類型,那么該方法可以傳入任何類型

????????一個(gè)方法需要的返回值類型是Object類型,那么該方法的返回值可以是任意類型

????????【Object定義的數(shù)組,可以保存任何Java類型】

????【萬(wàn)物皆可Object】

1.2toString方法【雞肋】

格式:

????public String toString();

作用:

????返回一個(gè)字符串,簡(jiǎn)要描述當(dāng)前類對(duì)象信息。

【Object原生方法】

????Student stu = new Student();

????Sout ==> stu

????com.qfedu.entity.Student@15db9742

????這里就是Object類內(nèi)toString方法原生效果

????【返回的是當(dāng)前對(duì)象對(duì)應(yīng)的完整包名.類名@當(dāng)前對(duì)象在內(nèi)存空間首地址(十六進(jìn)制)】

????當(dāng)涉及到類對(duì)象需要進(jìn)行信息簡(jiǎn)要描述時(shí),toString方法會(huì)默認(rèn)自行調(diào)用。

????比如:

????????Sout,信息保存...

【Object原生方法效果問(wèn)題】

????1. 展現(xiàn)信息較少

????2. 無(wú)法直觀的看到類對(duì)象中保存的數(shù)據(jù)

????在存在需求的情況下,可以重寫(xiě)toString方法來(lái)滿足當(dāng)前類對(duì)象簡(jiǎn)要描述需求。通常情況下,這里不需要手寫(xiě)

使用快捷鍵直接完成

????Alt + Shift + S

????==> toString方法重寫(xiě)

package com.qfedu.a_object;

class Dog {

????private String name;

????private int age;

????public Dog() {}

????public Dog(String name, int age) {

????????this.name = name;

????????this.age = age;

????}

????public String getName() {

????????return name;

????}

????public void setName(String name) {

????????this.name = name;

????}

????public int getAge() {

????????return age;

????}

????public void setAge(int age) {

????????this.age = age;

????}

????@Override

????public String toString() {

????????return "Dog [name=" + name + ", age=" + age + "]";

????}

}

public class Demo1 {

????public static void main(String[] args) {

????????Dog dog = new Dog("王可可", 5);

????????System.out.println(dog);

????}

}

1.3 equals方法【重點(diǎn)】

1.3.1 equals方法原生概述

格式:

????public boolean equals(Object obj);

作用:

????比較兩個(gè)類對(duì)象是否一致,是否是同一個(gè)對(duì)象,如果是返回true,如果不是返回false

在Object類內(nèi)的原始操作方式:

????比較兩個(gè)對(duì)象的空間首地址。

????public boolean equals(Object obj) {

? ? ? ? return (this == obj);

? ? }

? ? this表示調(diào)用當(dāng)前方法的類對(duì)象,實(shí)際就是一個(gè)空間首地址

? ? obj是傳入的參數(shù),也是一個(gè)引用數(shù)據(jù)類型,同時(shí)也是保存一個(gè)空間首地址

? ? 【兩個(gè)對(duì)象空間首地址一致,表示同一個(gè)對(duì)象】

1.3.2 原生equals方法使用瓶頸

package com.qfedu.a_object;

public class Demo2 {

????public static void main(String[] args) {

????????Person person1 = new Person(1, "馬爾扎哈", 1000);

????????Person person2 = new Person(2, "迪麗熱巴", 28);

????????Person person3 = new Person(3, "古力娜扎", 30);

????????Person person4 = new Person(4, "哈利波特", 30);

????????Person person5 = new Person(5, "羅納爾多", 50);

????????Person person6 = new Person(6, "努爾哈赤", 1500);

????????Person person7 = new Person(6, "努爾哈赤", 1500);

????????System.out.println(person1);

????????System.out.println(person2);

????????System.out.println(person3);

????????System.out.println(person4);

????????System.out.println(person5);

????????System.out.println(person6);

????????/*

????????* equals默認(rèn)比較方式是空間首地址比較,這里person6和person7兩個(gè)對(duì)象

????????* 都是通過(guò)new + 構(gòu)造方法創(chuàng)建而來(lái),空間首地址是完全不一樣的!?。?/p>

????????*

????????* 但是從代碼中可以發(fā)現(xiàn),這里兩個(gè)對(duì)象保存的內(nèi)容是一致的,對(duì)于這樣的一種情況

????????* 其實(shí)在開(kāi)發(fā)中還是存在一定的需求的。實(shí)際開(kāi)發(fā)中存在需要比較兩個(gè)對(duì)象中保存數(shù)據(jù)

????????* 是否一致的情況,這里需要重寫(xiě)equals方法。

????????*

????????* equals方法在使用過(guò)程中一定要明確調(diào)用者是誰(shuí)。

????????*/

????????System.out.println(person6.equals(person7));

????}

}

1.3.3 equals方法如何重寫(xiě)

思路

????1. 判斷比較的兩個(gè)對(duì)象是不是同一個(gè)對(duì)象。

????????保留原本的this == obj,滿足條件直接判斷為true

????2. 數(shù)據(jù)類型要求一致。

????????數(shù)據(jù)類型必須是一致的情況下才可以進(jìn)行比較?。。∪绻鹐quals方法傳入?yún)?shù)的數(shù)

????????據(jù)類型不是當(dāng)前調(diào)用方法的類對(duì)象對(duì)應(yīng)數(shù)據(jù)類型。沒(méi)有必要進(jìn)行比較。

????3. 判斷【自定義比較】?jī)?nèi)容

????????id name age 完全一致,兩個(gè)對(duì)象相同。

【注意】

????equals方法實(shí)際上是可以通過(guò)IDE開(kāi)發(fā)工具直接完成的,完成的思路過(guò)程和以上內(nèi)容一致,這里需要大家首先來(lái)自定義完成方法,后期使用工具來(lái)完成。

1.3.4 equals方法答疑

????1. 明確equals方法的調(diào)用對(duì)象是誰(shuí),后期代碼中會(huì)存在大量同名方法,但是調(diào)用對(duì)象不一致,效果不一致。

????2. 基本數(shù)據(jù)類型不能使用equals方法

????3. 這里存在多態(tài)的使用

????????a. equals方法所需參數(shù)是Object類型,不關(guān)什么類型數(shù)據(jù)傳入到方法中,都會(huì)自動(dòng)轉(zhuǎn)換為Object類型

????????b. 方法內(nèi)instanceOf判斷是判斷當(dāng)前傳入的對(duì)象真實(shí)情況,是不是當(dāng)前Person類型

????????c. 強(qiáng)制類型轉(zhuǎn)換時(shí)在明確數(shù)據(jù)類型一致的情況下,完成的,是用于方法操作成員變量。

????4. this

????????????this表示調(diào)用當(dāng)前方法的類對(duì)象,equals方法調(diào)用方式類對(duì)象.equals(另一個(gè)類對(duì)象)

????????????this表示類對(duì)象

1.4 hashCode方法【重點(diǎn)】

1.4.1 hashCode方法原生概述

hash ==> 哈希

hashCode ==> 哈希值

????哈希值是對(duì)象在開(kāi)發(fā)中的唯一標(biāo)識(shí)?。?!

????哈希值一般用于一定的哈希結(jié)構(gòu)存儲(chǔ)中。

????Java中hashCode方法是定義在Object類內(nèi),也就是說(shuō)在Java中任何一個(gè)對(duì)象都有hashCode方法,可以獲取當(dāng)前對(duì)象的哈希值。

????Object類內(nèi)默認(rèn)的哈希值是當(dāng)前對(duì)象的空間首地址 十進(jìn)制展示方式

1.4.2 Java開(kāi)發(fā)語(yǔ)法規(guī)定

Java中規(guī)定:

????如果Java中的兩個(gè)對(duì)象使用equals方法比較結(jié)果為true,表示相同的對(duì)象,那么要求當(dāng)前比較的兩個(gè)對(duì)象對(duì)應(yīng)的hashCode是一致的。

????有且只重寫(xiě)equals方法的情況下,hashCode方法返回的數(shù)據(jù)依然是對(duì)象對(duì)應(yīng)的空間首地址十進(jìn)制展示方式,如果兩個(gè)對(duì)象按照自定義equals方法比較結(jié)果為true,存在可能性兩個(gè)對(duì)象hashCode值不一致,這樣會(huì)導(dǎo)致后期使用的數(shù)據(jù)結(jié)果中,出現(xiàn)一些違背原則的問(wèn)題。

????hashCode方法返回的哈希值,也是當(dāng)前對(duì)象在一定結(jié)構(gòu)內(nèi)的唯一索引?。?!

【代碼開(kāi)發(fā)強(qiáng)制規(guī)定】

????如果按照自己的比較方式重寫(xiě)了equals方法,必須重寫(xiě)hashCode方法,來(lái)滿足要求。

1. 4.3 如何重寫(xiě)hashCode方法

格式:

????public int hashCode();

????返回值為int類型

一般要求:

????1. 會(huì)選擇帶有一定獨(dú)立性數(shù)據(jù),不可重復(fù)性數(shù)據(jù)作為hashCodo返回?cái)?shù)據(jù)的首要選擇。

????2. hashCode在開(kāi)發(fā)中或多或少都有可能出現(xiàn)沖突重復(fù)問(wèn)題,這里盡量避免!??!

【原則】

????equals方法比較結(jié)果為true,hashCode方法返回哈希一致

1.4.4屬性不存在對(duì)應(yīng)的int類型數(shù)據(jù)如何解決【小擴(kuò)展】

情況解釋

????實(shí)體類不存在任何一個(gè)int類型數(shù)據(jù),不存在唯一性數(shù)據(jù)。

????需要通過(guò)成員變量來(lái)完成組合操作獲取哈希值。

推薦一個(gè)方法

????Objects工具類提供的hash方法

????public static int hash(Object... values) {

? ? ? ? return Arrays.hashCode(values);

? ? }

? ? Object...

? ????? Object當(dāng)前方法所需數(shù)據(jù)類型為Object,也就說(shuō)支持任何數(shù)據(jù)類型

????? ? ... 表示這里參數(shù)個(gè)數(shù)不做任何限制,任意長(zhǎng)度,可以沒(méi)有參數(shù),可以是多個(gè)參數(shù)

????? ? ... 不定長(zhǎng)參數(shù)

? ? 指定的數(shù)據(jù)轉(zhuǎn)換計(jì)算之后得到一個(gè)具有唯一性的哈希值。

2、異常處理

2.1Java中的異常規(guī)則

Java中異常和錯(cuò)誤的提示機(jī)制也是前因后果!?。?/p>

????都是存在一個(gè)最基本的原則,從哪里到哪里

Java中的異常,錯(cuò)題提示已經(jīng)非常優(yōu)秀了?。。?/p>

????TeamViewer

????耐心看錯(cuò)誤?。?!

????錯(cuò)誤修改有助于提升技術(shù)?。。?/p>

2.3 Throwable類

Throwable是Java中所有異常和錯(cuò)誤的基類

--| Error 錯(cuò)誤

--| Exception 異常

構(gòu)造方法:

????Throwable();

????????創(chuàng)建一個(gè)Throwable類對(duì)象,其中保存的異?;蛘咤e(cuò)誤信息為null

????Throwable(String message); 【重點(diǎn)】

????????創(chuàng)建一個(gè)Throwable類對(duì)象,其中保存的異?;蛘咤e(cuò)誤信息為message

成員方法:

????String toString();

????????得到當(dāng)前異常的簡(jiǎn)要信息描述

????String getMessage();

????????獲取當(dāng)前Throwable類對(duì)象中保存的異?;蛘咤e(cuò)誤信息

????void printStackTrace(); 【偽重點(diǎn)】

? ? 在命令行中展示錯(cuò)誤的前因后果!?。〖t色字體

2.4 Error和Exceptiopn

Error 錯(cuò)誤

????無(wú)法處理,只能避免!?。?/p>

????錯(cuò)誤都是Error結(jié)尾

Exception 異常

????可以處理,還有挽回的余地

????異常都是Exception結(jié)尾

Java代碼中有一個(gè)數(shù)組需要申請(qǐng)64GB內(nèi)存,(目前電腦內(nèi)存32GB)

????不可能?。。″e(cuò)誤 Error

Java中代碼需要一個(gè)數(shù)組,但是比給予操作的數(shù)組不合法

????可以處理的,Exception

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容