接著前50條來分享,今天的部分涉及更多的代碼,全文都是干貨,建議收藏后觀看。
點(diǎn)擊回看前50條知識點(diǎn):《100條必背JAVA知識點(diǎn),你都掌握了嗎?(上)》
51.重寫的規(guī)則:
①子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同。
②子類重寫的方法的權(quán)限修飾符不小于父類被重寫的方法的權(quán)限修飾符
特殊情況:子類不能重寫父類中聲明為private權(quán)限的方法。
③返回值類型:
父類被重寫的方法的返回值類型是void,則子類重寫的方法的返回值類型只能是void。
父類被重寫的方法的返回值類型是A類型,則子類重寫的方法的返回值類型可以是A類或A類的子類。
父類被重寫的方法的返回值類型是基本數(shù)據(jù)類型(比如:double),則子類重寫的方法的返回值類型必須是相同的基本數(shù)據(jù)類型(必須也是double)。
④子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型。
52.什么是重寫和什么是重載?
53.super調(diào)用屬性、方法:①在子類的方法或構(gòu)造器中,通過使用"super.屬性"或"super.方法"的方式,顯式的調(diào)用父類中聲明的屬性或方法,通常情況下,習(xí)慣省略"super."。
②特殊情況:當(dāng)子類和父類中定義了同名的屬性時,要想在子類中調(diào)用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調(diào)用的是父類中聲明的屬性。
③特殊情況:當(dāng)子類重寫了父類中的方法以后,想在子類的方法中調(diào)用父類中被重寫的方法時,則必須顯式的使用"super.方法"的方式,表明調(diào)用的是父類中被重寫的方法。
54.super調(diào)用構(gòu)造器:①我們可以在子類的構(gòu)造器中顯式的使用"super(形參列表)"的方式,調(diào)用父類中聲明的指定的構(gòu)造器。
②"super(形參列表)"的使用,必須聲明在子類構(gòu)造器的首行!
③ 我們在類的構(gòu)造器中,針對于"this(形參列表)"或"super(形參列表)"只能二選一,不能同時出現(xiàn)。
④在構(gòu)造器的首行,沒顯式的聲明"this(形參列表)“或"super(形參列表)”,則默認(rèn)調(diào)用的是父類中空參的構(gòu)造器:super()。
⑤在類的多個構(gòu)造器中,至少一個類的構(gòu)造器中使用了"super(形參列表)",調(diào)用父類中的構(gòu)造器。
55.子類對象實例化過程:從結(jié)果上看,子類繼承父類以后,就獲取了父類中聲明的屬性或方法,創(chuàng)建子類的對象,就會在堆空間中加載父類中聲明的屬性。
從過程上看:通過子類的構(gòu)造器創(chuàng)建子類對象時,一定會直接或間接的調(diào)用其父類的構(gòu)造器,進(jìn)而調(diào)用父類的父類的構(gòu)造器,直到調(diào)用了java.lang.Object類中空參的構(gòu)造器為止。正因為加載過所有的父類的結(jié)構(gòu),所以才可以看到內(nèi)存中父類中的結(jié)構(gòu),子類對象才可以考慮進(jìn)行調(diào)用。
56.多態(tài)性:可以理解為一個事物的多種形態(tài)。對象的多態(tài)性:父類的引用指向子類的對象(或子類的對象賦給父類的引用),Person p = new Man(); 。有了對象的多態(tài)性以后,我們在編譯期,只能調(diào)用父類中聲明的方法,但在運(yùn)行期,我們實際執(zhí)行的是子類重寫父類的方法??偨Y(jié):編譯,看左邊;運(yùn)行,看右邊。多態(tài)運(yùn)行時行為,不是編譯時行為。
57.對象的多態(tài)性,只適用于方法,不適用于屬性(編譯和運(yùn)行都看左邊)。
58.Object類中定義的equals()和==的作用是相同的:比較兩個對象的地址值是否相同,即兩個引用是否指向同一個對象實體。
59.String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以后,比較的不是兩個引用的地址是否相同,而是比較兩個對象的"實體內(nèi)容"是否相同。
60.“==”如果比較的是基本數(shù)據(jù)類型變量,則比較兩個變量保存的數(shù)據(jù)是否相等。(不一定類型要相同,有自動類型提升)如果比較的是引用數(shù)據(jù)類型變量,則比較兩個對象的地址值是否相同,即兩個引用是否指向同一個對象實體。
61.當(dāng)我們輸出一個對象的引用時,實際上就是調(diào)用當(dāng)前對象的toString()。
62.Object類中toString()的定義:public String toString() {return getClass().getName() + “@” + Integer.toHexString(hashCode());}
63.像String、Date、File、包裝類等都重寫了Object類中的toString()方法,使得在調(diào)用對象的toString()時,返回"實體內(nèi)容"信息。
64.基本數(shù)據(jù)類型與對應(yīng)的包裝類:
65.自動裝箱和自動拆箱(JDK 5.0之后)
66.static關(guān)鍵字可以用來修飾屬性、方法、代碼塊、內(nèi)部類。
67.靜態(tài)變量 vs 實例變量
靜態(tài)變量:創(chuàng)建了類的多個對象,多個對象共享同一個靜態(tài)變量。當(dāng)通過某一個對象修改靜態(tài)變量時,會導(dǎo)致其他對象調(diào)用此靜態(tài)變量時,變量的值是修改過了的。
實例變量:創(chuàng)建了類的多個對象,每個對象都獨(dú)立擁有一套類中的非靜態(tài)屬性。當(dāng)修改其中一個對象中的非靜態(tài)屬性時,不會導(dǎo)致其他對象中同樣的屬性值的修改。
68.static修飾屬性的說明:① 靜態(tài)變量隨著類的加載而加載,可以通過"類.靜態(tài)變量"的方式進(jìn)行調(diào)用。
② 靜態(tài)變量的加載要早于對象的創(chuàng)建。
③ 由于類只會加載一次,則靜態(tài)變量在內(nèi)存中也只會存在一份:存在方法區(qū)的靜態(tài)域中。
69.static修飾方法的說明:①隨著類的加載而加載,可以通過"類.靜態(tài)方法"的方式進(jìn)行調(diào)用。
②靜態(tài)方法中,只能調(diào)用靜態(tài)的方法或?qū)傩浴7庆o態(tài)方法中,既可以調(diào)用非靜態(tài)的方法或?qū)傩?,也可以調(diào)用靜態(tài)的方法或?qū)傩浴?/span>
70.在靜態(tài)的方法內(nèi),不能使用this關(guān)鍵字、super關(guān)鍵字(生命周期)。靜態(tài)屬性和靜態(tài)方法的使用,都可以從生命周期的角度去理解。
71.單例設(shè)計模式:就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例。
代碼實現(xiàn)一:
好處:線程安全。
壞處:對象加載時間過長。
代碼實現(xiàn)二:
好處:延遲對象的創(chuàng)建。
壞處:線程不安全。
72.靜態(tài)代碼塊使用說明:
①內(nèi)部可以輸出語句
②隨著類的加載而執(zhí)行,而且只執(zhí)行一次
③作用:初始化類的信息
④如果一個類中定義了多個靜態(tài)代碼塊,則按照聲明的先后順序執(zhí)行
⑤靜態(tài)代碼塊的執(zhí)行要優(yōu)先于非靜態(tài)代碼塊的執(zhí)行
⑥靜態(tài)代碼塊內(nèi)只能調(diào)用靜態(tài)的屬性、靜態(tài)的方法,不能調(diào)用非靜態(tài)的結(jié)構(gòu)
73.非靜態(tài)代碼塊使用說明:
①內(nèi)部可以輸出語句
②隨著對象的創(chuàng)建而執(zhí)行
③每創(chuàng)建一個對象,就執(zhí)行一次非靜態(tài)代碼塊
④作用:可以在創(chuàng)建對象時,對對象的屬性等進(jìn)行初始化
⑤如果一個類中定義了多個非靜態(tài)代碼塊,則按照聲明的先后順序執(zhí)行
⑥非靜態(tài)代碼塊內(nèi)可以調(diào)用靜態(tài)的屬性、靜態(tài)的方法,或非靜態(tài)的屬性、非靜態(tài)的方法
74.實例化子類對象時,涉及到父類、子類中靜態(tài)代碼塊、非靜態(tài)代碼塊、構(gòu)造器的加載順序:由父及子,靜態(tài)先行。
75.屬性的賦值順序:
①默認(rèn)初始化
②顯式初始化/⑤在代碼塊中賦值
③構(gòu)造器中初始化
④有了對象以后,可以通過"對象.屬性"或"對象.方法"的方式,進(jìn)行賦值執(zhí)行的先后順序:① - ② / ⑤ - ③ - ④
76.final的使用說明:
①final可以用來修飾的結(jié)構(gòu):類、方法、變量
②final 用來修飾一個類:此類不能被其他類所繼承。比如:String類、System類、StringBuffer類
③final 用來修飾方法:表明此方法不可以被重寫,比如:Object類中g(shù)etClass();
④final 用來修飾變量:此時的"變量"就稱為是一個常量
⑤final修飾屬性:可以考慮賦值的位置有:顯式初始化、代碼塊中初始化、構(gòu)造器中初始化
⑥final修飾局部變量:尤其是使用final修飾形參時,表明此形參是一個常量。當(dāng)我們調(diào)用此方法時,給常量形參賦一個實參。一旦賦值以后,就只能在方法體內(nèi)使用此形參,但不能進(jìn)行重新賦值。
⑦static final 用來修飾屬性:全局常量
77.abstract可以用來修飾:類、方法。
abstract修飾類:抽象類
①此類不能實例化。
②抽象類中一定有構(gòu)造器,便于子類實例化時調(diào)用(涉及:子類對象實例化的全過程)。
abstract修飾方法:抽象方法
①抽象方法只有方法的聲明,沒方法體。
②包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象方法的。
③若子類重寫了父類中的所的抽象方法后,此子類方可實例化。
④若子類沒重寫父類中的所有的抽象方法,則此子類也是一個抽象類,需要使用abstract修飾
注意點(diǎn):abstract不能用來修飾:屬性、構(gòu)造器等結(jié)構(gòu);abstract不能用來修飾私有方法、靜態(tài)方法、final的方法、final的類。
78.接口使用interface來定義,Java中,接口和類是并列的兩個結(jié)構(gòu)。
79.JDK7及以前:只能定義全局常量和抽象方法
全局常量:public static final的.但是書寫時,可以省略不寫
抽象方法:public abstract的
JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態(tài)方法、默認(rèn)方法
80.接口中不能定義構(gòu)造器的!意味著接口不可以實例化。
81.Java開發(fā)中,接口通過讓類去實現(xiàn)(implements)的方式來使用。如果實現(xiàn)類覆蓋了接口中的所抽象方法,則此實現(xiàn)類就可以實例化。如果實現(xiàn)類沒覆蓋接口中所的抽象方法,則此實現(xiàn)類仍為一個抽象類。
82.Java類可以實現(xiàn)多個接口 —>彌補(bǔ)了Java單繼承性的局限性格式:class AA extends BB implements CC,DD,EE。
83.接口與接口之間可以繼承,而且可以多繼承。如下:
84.接口使用上也滿足多態(tài)性,接口,實際上就是定義了一種規(guī)范,下面這個例子可以幫你深刻理解并記住接口!
85.Java中關(guān)于接口的新規(guī)范
①接口中定義的靜態(tài)方法,只能通過接口來調(diào)用。
②通過實現(xiàn)類的對象,可以調(diào)用接口中的默認(rèn)方法。如果實現(xiàn)類重寫了接口中的默認(rèn)方法,調(diào)用時,仍然調(diào)用的是重寫以后的方法。
③如果子類(或?qū)崿F(xiàn)類)繼承的父類和實現(xiàn)的接口中,聲明了同名同參數(shù)的默認(rèn)方法,那么子類在沒重寫此方法的情況下,默認(rèn)調(diào)用的是父類中的同名同參數(shù)的方法。–>類優(yōu)先原則。
④如果實現(xiàn)類實現(xiàn)了多個接口,而這多個接口中定義了同名同參數(shù)的默認(rèn)方法,那么在實現(xiàn)類沒重寫此方法的情況下,報錯。–>接口沖突。這就需要我們必須在實現(xiàn)類中重寫此方法。
⑤如何在子類(或?qū)崿F(xiàn)類)的方法中調(diào)用父類、接口中被重寫的方法。
86.內(nèi)部類的分類:成員內(nèi)部類(靜態(tài)、非靜態(tài) )、局部內(nèi)部類(方法內(nèi)、代碼塊內(nèi)、構(gòu)造器內(nèi))。
87.成員內(nèi)部類的理解:①一方面,作為外部類的成員調(diào)用外部類的結(jié)構(gòu),可以被static修飾,可以被4種不同的權(quán)限修飾。
②另一方面,作為一個類類內(nèi)可以定義屬性、方法、構(gòu)造器等可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承可以被abstract修飾。
88.如何在外部類創(chuàng)建成員內(nèi)部類的對象?(靜態(tài)的,非靜態(tài)的)
89.如何在成員內(nèi)部類中調(diào)用外部類的結(jié)構(gòu)?
90.在局部內(nèi)部類的方法中(比如:show) ,如果調(diào)用局部內(nèi)部類所聲明的方法 *(比如:method)中的局部變量(比如:num)的話, *要求此局部變量聲明為final的。
91.jdk 7及之前版本:要求此局部變量顯式的聲明為final。jdk 8及之后的版本:可以省略final的聲明
92.java異常處理的抓拋模型——“拋”:程序在正常執(zhí)行的過程中,一旦出現(xiàn)異常,就會在異常代碼處,生成一個對應(yīng)異常類的對象,并將此對象拋出。一旦拋出對象以后,其后的代碼就不再執(zhí)行。
93.關(guān)于異常對象的產(chǎn)生:① 系統(tǒng)自動生成的異常對象② 手動的生成一個異常對象,并拋出(throw)。
94.“抓”:可以理解為異常的處理方式:① try-catch-finally② throws
95.異常處理模板:
注意點(diǎn):①finally是可選的。
②使用try將可能出現(xiàn)異常代碼包裝起來,在執(zhí)行過程中,一旦出現(xiàn)異常,就會生成一個對應(yīng)異常類的對象,根據(jù)此對象的類型,去catch中進(jìn)行匹配。
③一旦try中的異常對象匹配到某一個catch時,就進(jìn)入catch中進(jìn)行異常的處理。一旦處理完成,就跳出當(dāng)前的try-catch結(jié)構(gòu)(在沒寫finally的情況,繼續(xù)執(zhí)行其后的代碼。)
④catch中的異常類型如果沒子父類關(guān)系,則誰聲明在上,誰聲明在下無所謂。catch中的異常類型如果滿足子父類關(guān)系,則要求子類一定聲明在父類的上面。否則報錯。
⑤常用的異常對象處理的方式:⑴ String getMessage() ⑵ printStackTrace()
⑥在try結(jié)構(gòu)中聲明的變量,再出了try結(jié)構(gòu)以后,就不能再被調(diào)用。
⑦try-catch-finally結(jié)構(gòu)可以嵌套。
⑧finally中聲明的是一定會被執(zhí)行的代碼。即使catch中又出現(xiàn)了異常,try中出現(xiàn)了return語句,catch中出現(xiàn)了return語句等情況。
96."throws + 異常類型"寫在方法的聲明處。指明此方法執(zhí)行時,可能會拋出的異常類型。throws的方式只是將異常拋給了方法的調(diào)用者。并沒真正將異常處理掉。
97.如果父類中被重寫的方法沒用throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中異常,必須使用try-catch-finally方式處理。
98.子類重寫的方法拋出的異常類型,不大于父類被重寫的方法拋出的異常類型。
99.在程序執(zhí)行中,除了自動拋出異常對象的情況之外,我們還可以手動的throw一個異常類的對象。
100.如何自定義一個異常類?
掃碼添加捷碼微信入群~已有5000+智慧城市/AloT/IT行業(yè)精英入群交流,入群即得《Java核心技術(shù)電子書》
接入DeepSeek大模型是什么意思?到底能帶來哪些改變? 閱讀604次
一句話生成設(shè)計,產(chǎn)品經(jīng)理:畫原型不存在了 閱讀874次
點(diǎn)擊“立即申請”即可成為捷碼客戶,將享受捷碼終身技術(shù)咨詢服務(wù),和遠(yuǎn)程技術(shù)支持服務(wù)。