最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Java中的String實(shí)例化、Annotation注解類(lèi)、繼承的多態(tài)和Object類(lèi)(附帶相關(guān)面試題)

2023-08-04 14:58 作者:Alphamilk  | 我要投稿

1.java中String兩種實(shí)例化對(duì)象

在Java中String并不是一個(gè)數(shù)據(jù)類(lèi)型,而是引用數(shù)據(jù)類(lèi)型

創(chuàng)建方式的區(qū)別

作為特殊類(lèi),其創(chuàng)建方式有兩種

下面介紹其區(qū)別:


strA在堆上創(chuàng)建mldn空間,而strB的實(shí)例化中有new 即新創(chuàng)建一個(gè)空間內(nèi)容也是mldn,而strc內(nèi)容是mldn與strA是一致的,所以不會(huì)再分配新的空間,而是直接將strC的棧地址直接指向strA的堆地址

*面試題:new String("a") + new String("b") 會(huì)創(chuàng)建幾個(gè)對(duì)象?

對(duì)象1:new StringBuilder()

對(duì)象2:new String("a")

對(duì)象3:常量池中的"a"

對(duì)象4:new String("b")

對(duì)象5:常量池中的"b"

深入剖析:StringBuilder中的toString():

對(duì)象6:new String("ab")

強(qiáng)調(diào)一下,toString()的調(diào)用,在字符串常量池中,沒(méi)有生成"ab"

2.Annotation注解類(lèi)

?1.@Override 準(zhǔn)確性覆寫(xiě)類(lèi)

覆寫(xiě)發(fā)生在子類(lèi)中有一個(gè)和父類(lèi)相同方法名、相同參數(shù)列表和相同返回類(lèi)型的方法時(shí)。在一般情況下,通過(guò)子類(lèi)對(duì)象調(diào)用該方法時(shí),會(huì)直接調(diào)用子類(lèi)中的方法。這是因?yàn)樽宇?lèi)方法覆蓋了父類(lèi)方法,所以會(huì)優(yōu)先調(diào)用子類(lèi)的方法實(shí)現(xiàn)。

然而,如果在某些情況下出現(xiàn)錯(cuò)誤,可能會(huì)導(dǎo)致錯(cuò)誤地調(diào)用父類(lèi)的方法,例如:

  1. 子類(lèi)方法的簽名與父類(lèi)方法不一致:如果子類(lèi)中定義的方法簽名與父類(lèi)的方法簽名不完全匹配,例如參數(shù)列表不同,那么不會(huì)發(fā)生準(zhǔn)確性覆寫(xiě),而是子類(lèi)創(chuàng)建了一個(gè)新的方法,和父類(lèi)的方法沒(méi)有關(guān)聯(lián)。此時(shí),通過(guò)子類(lèi)對(duì)象調(diào)用方法時(shí),會(huì)調(diào)用到父類(lèi)的方法。

  2. 在子類(lèi)中使用了super關(guān)鍵字:子類(lèi)中可以使用super關(guān)鍵字調(diào)用父類(lèi)的方法,即使發(fā)生了準(zhǔn)確性覆寫(xiě)。在這種情況下,通過(guò)super關(guān)鍵字調(diào)用的是父類(lèi)的方法,而不是子類(lèi)的方法。

所以通過(guò)@Override就可以避免出現(xiàn)上述問(wèn)題從而正常調(diào)用子類(lèi)

2.@Deprecated過(guò)期聲明注解

當(dāng)一個(gè)類(lèi)可能已經(jīng)不符合生產(chǎn)的需求后,但是如果隨便刪除這個(gè)類(lèi)可能會(huì)導(dǎo)致整個(gè)程序結(jié)構(gòu)的不穩(wěn)定從而出錯(cuò),所以java中就有@Deprecated過(guò)期聲明注解,在用該注解后某個(gè)類(lèi)或者某個(gè)方法將不再建議使用。如果調(diào)用則會(huì)在方法上加上刪除線

*面試題: 在 Java 中,什么時(shí)候用重載,什么時(shí)候用重寫(xiě)?


(1)重載是多態(tài)的集中體現(xiàn),在類(lèi)中,要以統(tǒng)一的方式處理不同類(lèi)型數(shù)據(jù)的時(shí)候,可以用重載。

(2)重寫(xiě)的使用是建立在繼承關(guān)系上的,子類(lèi)在繼承父類(lèi)的基礎(chǔ)上,增加新的功能,可以用重寫(xiě)。

(3)簡(jiǎn)單總結(jié):

重載是多樣性,重寫(xiě)是增強(qiáng)劑;
目的是提高程序的多樣性和健壯性,以適配不同場(chǎng)景使用時(shí),使用重載進(jìn)行擴(kuò)展;
目的是在不修改原方法及源代碼的基礎(chǔ)上對(duì)方法進(jìn)行擴(kuò)展或增強(qiáng)時(shí),使用重寫(xiě);


3.多態(tài)

1.向上轉(zhuǎn)型

向上轉(zhuǎn)型 即大范圍轉(zhuǎn)到小范圍 比如 動(dòng)物和狗,動(dòng)物就是父類(lèi),狗是子類(lèi),這種往下細(xì)分的操作就叫向上轉(zhuǎn)型

父類(lèi) name = new 子類(lèi)();

為什么要出現(xiàn)向上轉(zhuǎn)型

  1. 統(tǒng)一接口:通過(guò)向上轉(zhuǎn)型,可以將不同子類(lèi)的對(duì)象都當(dāng)作父類(lèi)類(lèi)型來(lái)處理。這樣可以使用統(tǒng)一的接口對(duì)這些對(duì)象進(jìn)行操作,簡(jiǎn)化了代碼的編寫(xiě)和維護(hù)。如果有多個(gè)子類(lèi),使用向上轉(zhuǎn)型可以避免針對(duì)每個(gè)子類(lèi)都編寫(xiě)相似的代碼段,提高了代碼的重用性。

  2. 擴(kuò)展性:通過(guò)向上轉(zhuǎn)型,可以更加方便地?cái)U(kuò)展代碼,增加新的子類(lèi),而無(wú)需修改已有的代碼。這是因?yàn)橄蛏限D(zhuǎn)型使得代碼與具體子類(lèi)解耦,如果需要增加一個(gè)新的子類(lèi),只需要修改創(chuàng)建對(duì)象的部分,而不需要修改其他已經(jīng)存在的代碼邏輯。

  3. 可替換性:通過(guò)向上轉(zhuǎn)型,可以實(shí)現(xiàn)對(duì)子類(lèi)對(duì)象的替換。即使使用父類(lèi)引用變量來(lái)引用子類(lèi)對(duì)象,仍然可以調(diào)用子類(lèi)中重寫(xiě)的方法,實(shí)現(xiàn)對(duì)父類(lèi)引用的靈活使用。這使得程序在后續(xù)的維護(hù)和擴(kuò)展過(guò)程中更加方便,可以根據(jù)需要輕松地切換不同的子類(lèi)實(shí)現(xiàn)。

通過(guò)向上轉(zhuǎn)型,我們可以實(shí)例化一個(gè) Animal 對(duì)象,并且通過(guò)該對(duì)象引用子類(lèi)對(duì)象,從而靈活地切換它們之間的關(guān)系。然而,向上轉(zhuǎn)型有一個(gè)重要限制,即我們只能調(diào)用父類(lèi)中定義的方法,或者子類(lèi)中覆蓋了的方法。這意味著,一些子類(lèi)特有的功能將無(wú)法直接通過(guò)父類(lèi)引用調(diào)用。例如,在上述代碼中,我們可以使用 animal.sound() 調(diào)用 Animal 類(lèi)中的 sound 方法,但無(wú)法使用 animal.playFetch() 調(diào)用 Dog 或 Cat 類(lèi)特有的 playFetch 方法。

為此就有了向下轉(zhuǎn)型

2.向下轉(zhuǎn)型

條件:必須要在向上轉(zhuǎn)型的基礎(chǔ)上才能進(jìn)行向下轉(zhuǎn)型,否則父類(lèi)與子類(lèi)無(wú)關(guān)聯(lián)的情況下無(wú)法進(jìn)行聯(lián)系

案例代碼:

3.instanceof關(guān)鍵字(判斷是否能向下轉(zhuǎn)型)

當(dāng)使用了向上轉(zhuǎn)型后,將子類(lèi)的實(shí)例賦值給父類(lèi)的引用變量時(shí),就會(huì)喪失對(duì)子類(lèi)特有方法的直接訪問(wèn)能力。此時(shí),如果想要調(diào)用子類(lèi)的方法,就需要進(jìn)行安全轉(zhuǎn)型,即使用 instanceof 檢查對(duì)象是否為某個(gè)特定類(lèi)型,并在確認(rèn)類(lèi)型后進(jìn)行強(qiáng)制轉(zhuǎn)型。

在這種情況下,如果我們直接調(diào)用子類(lèi)的方法而沒(méi)有進(jìn)行安全轉(zhuǎn)型,會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)榫幾g器只知道引用變量的靜態(tài)類(lèi)型,而無(wú)法確定運(yùn)行時(shí)實(shí)際對(duì)象的類(lèi)型。這樣的錯(cuò)誤可能會(huì)導(dǎo)致程序在運(yùn)行時(shí)拋出 ClassCastException 異常,因?yàn)閲L試將父類(lèi)引用轉(zhuǎn)換為子類(lèi)類(lèi)型是非法的。

用法:? 實(shí)例化對(duì)象名稱(chēng) instanceof 類(lèi)? 返回boolean類(lèi)型的值

具體應(yīng)用:

4.Object類(lèi)

1.概述

1.在Java中,Object類(lèi)是所有類(lèi)的根類(lèi),也可以說(shuō)是所有類(lèi)的父類(lèi)。它定義了一些通用的方法,如equals()、hashCode()toString()等。當(dāng)我們定義一個(gè)類(lèi)時(shí),如果沒(méi)有顯式指定它的父類(lèi),那么默認(rèn)情況下該類(lèi)會(huì)直接繼承自Object類(lèi)。因此,你可以將其視為所有類(lèi)的隱式父類(lèi)。

然而,并不是所有類(lèi)型的數(shù)據(jù)都可以被向上轉(zhuǎn)型為Object類(lèi)型。在Java中,基本類(lèi)型(如int、booleanchar等)是不能直接向上轉(zhuǎn)型為Object類(lèi)型的。相反,只有引用類(lèi)型(如類(lèi)、接口等)可以被向上轉(zhuǎn)型為Object類(lèi)型。

在Java中,當(dāng)我們將一個(gè)引用類(lèi)型的對(duì)象向上轉(zhuǎn)型為Object類(lèi)型時(shí),它實(shí)際上已經(jīng)是Object類(lèi)型的對(duì)象了,但是我們只能通過(guò)Object類(lèi)型的引用變量訪問(wèn) Object 類(lèi)中定義的方法,無(wú)法直接調(diào)用原始類(lèi)型的方法。如果我們想要調(diào)用原始類(lèi)型的方法,就需要進(jìn)行向下轉(zhuǎn)型(即安全強(qiáng)制類(lèi)型轉(zhuǎn)換)。

因此,盡管Object類(lèi)可以作為所有類(lèi)的父類(lèi),但并不意味著它可以接受所有類(lèi)型的數(shù)據(jù)。只有引用類(lèi)型可以被向上轉(zhuǎn)型為Object類(lèi)型,而基本類(lèi)型不能。同時(shí),為了調(diào)用子類(lèi)特有的方法,還需要進(jìn)行向下轉(zhuǎn)型。

2.Object的toString方法

面試題:hashcode是什么?有什么作用?

Java中Object有一個(gè)方法:

public native int hashcode();

(1)hashcode()方法的作用

1.hashcode()方法主要配合基于散列的集合(相關(guān)知識(shí)在java的類(lèi)集中進(jìn)行學(xué)習(xí))一起使用,比如HashSet、HashMap、HashTable。

當(dāng)集合需要添加新的對(duì)象時(shí),先調(diào)用這個(gè)對(duì)象的hashcode()方法,得到對(duì)應(yīng)的hashcode值,實(shí)際上hashmap中會(huì)有一個(gè)table保存已經(jīng)存進(jìn)去的對(duì)象的hashcode值,如果table中沒(méi)有改hashcode值,則直接存入,如果有,就調(diào)用equals方法與新元素進(jìn)行比較,相同就不存了,不同就存入。

(2)equals和hashcode的關(guān)系

如果equals為true,hashcode一定相等;

如果equals為false,hashcode不一定不相等;

如果hashcode值相等,equals不一定相等;

如果hashcode值不等,equals一定不等;

(3)重寫(xiě)equals方法時(shí),一定要重寫(xiě)hashcode方法

?Object還有非常多的方法將在以后章節(jié)展現(xiàn)






Java中的String實(shí)例化、Annotation注解類(lèi)、繼承的多態(tài)和Object類(lèi)(附帶相關(guān)面試題)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
拉萨市| 泸水县| 承德县| 日土县| 枣庄市| 抚州市| 萝北县| 垣曲县| 文化| 兴安县| 东至县| 张北县| 铜梁县| 巨鹿县| 金坛市| 宽甸| 星座| 江永县| 谷城县| 鲁山县| 祁连县| 敦煌市| 焉耆| 惠安县| 镇沅| 昌江| 佛坪县| 象山县| 永仁县| 乐清市| 郎溪县| 县级市| 神农架林区| 甘肃省| 长岭县| 兴山县| 宁国市| 昆山市| 克山县| 且末县| 定安县|