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