本節(jié)學(xué)習(xí)目標(biāo)
- 掌握final 關(guān)鍵字的主要作用及使用;
- 掌握對(duì)象多態(tài)性的概念以及對(duì)象轉(zhuǎn)型的操作;
-
掌握instanceof 關(guān)鍵字的主要作用及使用;
1?? final 關(guān)鍵字
在Java 中 final稱為終結(jié)器,在Java 里面可以使用 final定義類、方法和屬性,用于表示不可變性。
-
final
類:當(dāng)一個(gè)類被聲明為final
時(shí),意味著該類不能被繼承。換句話說,不能創(chuàng)建該類的子類。通常將類聲明為final
的主要原因是防止其他類修改或擴(kuò)展該類的行為。例如,java.lang.String
就是一個(gè)被聲明為final
的類; -
final
方法:當(dāng)一個(gè)方法被聲明為final
時(shí),意味著該方法不能被子類重寫或覆蓋。這種限制可以保護(hù)方法的實(shí)現(xiàn),確保不會(huì)被修改。通常情況下,一個(gè)方法被聲明為final
是因?yàn)樗膶?shí)現(xiàn)在父類中已經(jīng)足夠完善,不希望子類對(duì)其進(jìn)行修改; -
final
變量:當(dāng)一個(gè)變量被聲明為final
時(shí),意味著該變量的值不能被更改。一旦給final
變量賦值,就不能再修改它的值。通常將變量聲明為final
是為了防止其被重新分配或重新賦值,保持其不可變性。final
變量可以是基本類型(如int
、double
等)或引用類型(如對(duì)象、數(shù)組引用等),但引用類型的final
變量指的是不能被重新分配,即不能再指向其他對(duì)象,但仍然可以修改對(duì)象的狀態(tài)。
使用final關(guān)鍵字可以帶來以下好處:
- 提高性能:
final
關(guān)鍵字可以使編譯器進(jìn)行優(yōu)化,因?yàn)樗肋@些元素不會(huì)被改變,所以可以進(jìn)行一些優(yōu)化處理。 - 增加安全性:
final
關(guān)鍵字可以防止意外修改或覆蓋。當(dāng)某個(gè)類、方法或變量對(duì)于某種場(chǎng)景下應(yīng)該保持固定不變時(shí),使用final
可以提供更強(qiáng)的安全性和可靠性。 - 支持設(shè)計(jì)決策:通過將類、方法或變量聲明為
final
,可以明確表達(dá)出它們?cè)谠O(shè)計(jì)中的意圖和限制。
1.1 final類
使用 final 定義的類不能再有子類,即:任何類都不能繼承以 final
聲明的父類。
// 范例 1: 觀察 final 定義的類
final class A{} // 此類不能夠有子類
class B extends A{} // 錯(cuò)誤的繼承
此程序中由于 A
類在定義時(shí)使用了 final
關(guān)鍵字,這樣 A
就不能再有子類了,所以當(dāng) B
類繼承 A
類時(shí)會(huì)在編譯時(shí)出現(xiàn)語法錯(cuò)誤。
需要注意的是,只是進(jìn)行應(yīng)用開發(fā)的話,那么大部分情況下不需要使用 final
來定義類。而如果是一些系統(tǒng)架構(gòu)的代碼開發(fā)時(shí),才有可能會(huì)使用到這樣的代碼。同時(shí)要注意一點(diǎn):String
也是使用 final
定義的類,所以String
類不允許被繼承。
1.2 final方法
使用 final
定義的方法不能被子類所覆寫。 在一些時(shí)候由于父類中的某些方法具備一些重要的特征,并且這些特征不希望被子類破壞(不能夠覆寫), 就可以在方法的聲明處加上final
, 意思是子類不要去破壞這個(gè)方法的原本作用。
// 范例 2: 觀察 final 定義方法
class A{
public final void fun(){} // 此方法不允許子類覆寫
}
class B extends A{
public void fun(){} //錯(cuò)誤:此處不允許覆寫
}
此程序在 A
類中定義的 fun()
方法上使用了final
進(jìn)行定義,這就意味著子類在繼承 A
類后將不允許覆寫 fun()
方法。
1.3 final屬性
使用 final
定義的變量就成為了常量,常量必須在定義的時(shí)候設(shè)置好內(nèi)容,并且不能修改。
// 范例 3: 定義常量
class A{
final double GOOD = 100.0; //GOOD級(jí)別就是100.0
public final void fun(){
GOOD = 1.1; //錯(cuò)誤:不能夠修改常量
}
}
此程序使用 final
定義了一個(gè)常量 “GOOD
”, 這就相當(dāng)于利用 “GOOD
” 這個(gè)名稱代表了“100.0
” 這個(gè)數(shù)據(jù)。所以代碼中定義常量的最大意義在于:使用常量可以利用字符串(常量名稱)來更直觀地描述數(shù)據(jù)。
大家可以發(fā)現(xiàn)本處定義的常量名稱使用了全部字母大寫的形式(final double GOOD =100.0;
),這是Java中的命名規(guī)范要求,這樣做的好處是可以明確地與變量名稱進(jìn)行區(qū)分,開發(fā)中也應(yīng)該遵守。
而在定義常量中還有一個(gè)更為重要的概念 — — 全局常量,所謂全局常量指的就是使用了"public
"、“static
”、“final
”3個(gè)關(guān)鍵字聯(lián)合定義的常量,例如:
public static final String MSG = "小山";
static
修飾的數(shù)據(jù)保存在公共數(shù)據(jù)區(qū),所以此處的常量就是一個(gè)公共常量。同時(shí)一定要記住,在定義常量時(shí)必須對(duì)其進(jìn)行初始化賦值,否則將出現(xiàn)語法錯(cuò)誤。
2?? 多態(tài)性
前面文章中已經(jīng)詳細(xì)解析了面向?qū)ο蟮姆庋b性、繼承性兩大特征,而多態(tài)是面向?qū)ο蟮淖詈笠粋€(gè)主要特征,也是一個(gè)非常重要的特性,掌握了多態(tài)性才可以編寫出更加合理的面向?qū)ο蟪绦?。而多態(tài)性在開發(fā)中可以體現(xiàn)在以下兩個(gè)方面:
-
方法的多態(tài)性:重載與覆寫;
- 方法重載:同一個(gè)方法名稱,根據(jù)不同的參數(shù)類型及個(gè)數(shù)可以完成不同的功能;
- 方法覆寫:同一個(gè)方法,根據(jù)實(shí)例化的子類對(duì)象不同,所完成的功能也不同。
-
對(duì)象的多態(tài)性:父子類對(duì)象的轉(zhuǎn)換。
- 向上轉(zhuǎn)型:子類對(duì)象變?yōu)楦割悓?duì)象,格式:父類 父類對(duì)象 = 子類實(shí)例,自動(dòng)類型轉(zhuǎn)換;
- 向下轉(zhuǎn)型:父類對(duì)象變?yōu)樽宇悓?duì)象,格式:子類 子類對(duì)象 = (子類) 父類實(shí)例,強(qiáng)制類型轉(zhuǎn)換。
對(duì)于方法的多態(tài)性在之前已經(jīng)有了詳細(xì)地闡述,所以本節(jié)主要介紹對(duì)象多態(tài)性,有一點(diǎn)需要注意的是,對(duì)象多態(tài)性和方法覆寫是緊密聯(lián)系在一起的。
當(dāng)然,要想真正理解多態(tài)性是如何去應(yīng)用的,多態(tài)性更合理的解釋需要結(jié)合抽象類與接口來一起講解,下一篇文章將會(huì)為大家介紹抽象類與接口等知識(shí),而要想充分理解這一概念也需要更多時(shí)間的了解與沉淀。
// 范例 4: 觀察如下程序
class A{
public void print(){
System.out.println("A 、public void print(){}");
}
}
class B extends A{
public void print(){ // 此時(shí)子類覆寫了父類中的print()方法
System.out.println("B 、public void print(){}");
}
}
public class TestDemo {
public static void main(String args[]){
B b = new B(); //實(shí)例化的是子類對(duì)象
b.print(); //調(diào)用被子類覆寫過的方法
}
}
程序執(zhí)行結(jié)果:
B 、public void print(){}
此程序在方法覆寫中已經(jīng)講解過了,由于現(xiàn)在子類B
覆寫了A
類中的 print()
, 并且在主方法中實(shí)例化的是子類對(duì)象,這樣當(dāng)調(diào)用 print()
方法時(shí)調(diào)用的一定是已經(jīng)被覆寫過的方法。也就是說在本程序中需要觀察以下兩點(diǎn)。
(1)觀察實(shí)例化的是哪個(gè)類的對(duì)象:“new B()
”;
(2)觀察調(diào)用的方法是否被子類所覆寫,如果覆寫了,則調(diào)用被覆寫過的方法,否則調(diào)用父類方法。
2.1 向上轉(zhuǎn)型
那么這樣的概念與對(duì)象的多態(tài)性有什么關(guān)聯(lián)呢?下面對(duì)上邊案例的主方法進(jìn)行一些變更,以觀察對(duì)象的向上轉(zhuǎn)型操作。
// 范例 5: 對(duì)象向上轉(zhuǎn)型(自動(dòng)完成)
public class TestDemo {
public static void main(String args[]){
A a = new B(); // 實(shí)例化的是子類對(duì)象,對(duì)象向上轉(zhuǎn)型
a.print(); //調(diào)用被子類覆寫過的方法
}
}
程序執(zhí)行結(jié)果:
B 、public void print(){}
可以看到此程序的執(zhí)行結(jié)果與范例4 的程序執(zhí)行結(jié)果沒有任何區(qū)別,然而在本程序中發(fā)生了對(duì)象的向上轉(zhuǎn)型操作 (A a = new B();
),并且最終由父類對(duì)象調(diào)用了 print()
方法,但是最終的執(zhí)行結(jié)果卻是被子類所覆寫過的方法的執(zhí)行結(jié)果。
而產(chǎn)生這樣結(jié)果的原因也很好理解,在范例4 中已經(jīng)重點(diǎn)強(qiáng)調(diào)過:根據(jù)實(shí)例化對(duì)象所在類是否覆寫了父類中的方法來決定最終執(zhí)行,此程序?qū)嵗氖亲宇悓?duì)象 (new B()
),并且 print()
方法又被子類覆寫了,那么最終所調(diào)用的一定是被覆寫過的方法。
實(shí)際上通過此程序大家可以發(fā)現(xiàn)對(duì)象向上轉(zhuǎn)型的特點(diǎn),整個(gè)操作中根本不需要關(guān)心對(duì)象的聲明類型,關(guān)鍵在于實(shí)例化新對(duì)象時(shí)所調(diào)用的是哪個(gè)子類的構(gòu)造,如果方法被子類所覆寫,調(diào)用的就是被覆寫過的方法,否則就調(diào)用父類中定義的方法。這一點(diǎn)與方法覆寫的執(zhí)行原則是完全一樣的。
2.2 向下轉(zhuǎn)型
在清楚了對(duì)象的向上轉(zhuǎn)型操作及特點(diǎn)后,下面再來觀察對(duì)象的向下轉(zhuǎn)型操作。
// 范例 6: 對(duì)象向下轉(zhuǎn)型
public class TestDemo {
public static void main(String args[]){
A a = new B(); //實(shí)例化的是子類對(duì)象,對(duì)象向上轉(zhuǎn)型
B b = (B) a; //對(duì)象需要強(qiáng)制性地向下轉(zhuǎn)型
b.print(); //調(diào)用被子類覆寫過的方法
}
}
程序執(zhí)行結(jié)果:
B 、public void print(){}
此程序首先利用對(duì)象的向上轉(zhuǎn)型實(shí)例化了父類A
的對(duì)象,然后將此對(duì)象進(jìn)行向下轉(zhuǎn)型為子類 B
的對(duì)象,由于整個(gè)代碼中關(guān)鍵字 new
調(diào)用的是子類 B
的構(gòu)造 (new B()
),所以調(diào)用的是被子類 B
所覆寫的 print()
方法。
因?yàn)橛袕?qiáng)制性轉(zhuǎn)換的操作,所以向下轉(zhuǎn)型操作本身是有前提條件的,即必須發(fā)生向上轉(zhuǎn)型后才可以發(fā)生向下轉(zhuǎn)型。如果是兩個(gè)沒有關(guān)系的類對(duì)象發(fā)生強(qiáng)制轉(zhuǎn)換,就會(huì)出現(xiàn) “ClassCastException
” 異常。
// 范例 7: 錯(cuò)誤的轉(zhuǎn)型操作
public class TestDemo {
public static void main(String args[]){
A a = new A(); //直接實(shí)例化對(duì)象, 此時(shí)并沒有發(fā)生子類對(duì)象向上轉(zhuǎn)型的操作,所以強(qiáng)制轉(zhuǎn)型會(huì)帶來安全隱患
B b = (B)a; //強(qiáng)制向下轉(zhuǎn)型,此處產(chǎn)生“ClassCastException”異常
b.print(); //此語句無法執(zhí)行
}
}
程序執(zhí)行結(jié)果:
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B at TestDemo.main(TestDemo.java:29)
本程序出現(xiàn)的異常表示的是類轉(zhuǎn)換異常,指的是兩個(gè)沒有關(guān)系的類對(duì)象強(qiáng)制發(fā)生轉(zhuǎn)型時(shí)所帶來的異常。因?yàn)榇藭r(shí)并沒有發(fā)生向上轉(zhuǎn)型,所以向下轉(zhuǎn)型是會(huì)存在安全隱患的,開發(fā)中應(yīng)該盡量避免此類操作。
對(duì)象多態(tài)性的本質(zhì)是根據(jù)實(shí)例化對(duì)象所在的類是否覆寫了父類中的指定方法來決定最終執(zhí)行的方法體,那么這種向上或向下的對(duì)象轉(zhuǎn)型有什么意義呢?
在實(shí)際開發(fā)中,對(duì)象向上轉(zhuǎn)型的主要意義在于參數(shù)的統(tǒng)一,也是最為重要的用法,而對(duì)象的向下轉(zhuǎn)型指的是調(diào)用子類的個(gè)性化操作方法。
// 范例 8: 對(duì)象向上轉(zhuǎn)型作用分析
class A {
public void print(){
System.out.println("A、public void print(){}");
}
}
class B extends A{ //定義A的子類
public void print(){ //此時(shí)子類覆寫了父類中的print()方法
System.out.println("B、public void print(){}");
}
}
class C extends A { //定義A的子類
public void print(){ //此時(shí)子類覆寫了父類中的print()方法
System.out.println("C、public void print(){}");
}
}
public class TestDemo {
public static void main(String args[]){
fun(new B()); //對(duì)象向上轉(zhuǎn)型,等價(jià)于:A a=new B();
fun(new C()); //對(duì)象向上轉(zhuǎn)型,等價(jià)于:A a=new C();
}
/**
* 接收A類或其子類對(duì)象,不管傳遞哪個(gè)對(duì)象都要求調(diào)用print()方法
* @param a A類實(shí)例化對(duì)象
*/
public static void fun(A a)(
a.print();
}
}
程序執(zhí)行結(jié)果:
B、public void print(){}
C、public void print(){}
在此程序的 fun()
方法上只是接收了一個(gè) A
類的實(shí)例化對(duì)象,按照對(duì)象的向上轉(zhuǎn)型原則,此時(shí)的 fun()
方法可以接收 A
類對(duì)象或所有A
類的子類對(duì)象,這樣只需要一個(gè)A
類的參數(shù)類型,此方法就可以處理一切 A
的子類對(duì)象 (即便A
類有幾百萬個(gè)子類,fun()
方法依然可以接收及處理 )。 而在 fun()
方法中將統(tǒng)一調(diào)用 print()
方法,如果此時(shí)傳遞的是子類對(duì)象,并且覆寫過 print()
方法,就表示執(zhí)行被子類所覆寫過的方法。
如果說向上轉(zhuǎn)型是統(tǒng)一調(diào)用的參數(shù)類型,那么向下轉(zhuǎn)型就表示要執(zhí)行子類的個(gè)性化操作方法。實(shí)際上當(dāng)發(fā)生繼承關(guān)系后,父類對(duì)象可以使用的方法必須在父類中明確定義,例如:此時(shí)在父類中存在一個(gè) print()
方法,哪怕這時(shí)此方法被子類覆寫過,父類對(duì)象依然可以調(diào)用。但是如果子類要擴(kuò)充一個(gè) funB()
方法,這個(gè)方法父類對(duì)象并不知道, 一旦發(fā)生向 上轉(zhuǎn)型,那么 funB()
方法父類對(duì)象肯定無法使用。
// 范例 9: 子類擴(kuò)充父類方法
class A{
public void print(){
System.out.println("A、public void print(){}");
}
}
class B extends A{ //定義A的子類
public void print(){ //此時(shí)子類覆寫了父類中的print()方法
System.out.println("B、public void print(){}");
}
/**
* 在子類中擴(kuò)充一個(gè)新的方法,但是此方法只能由子類對(duì)象調(diào)用,父類對(duì)象不能調(diào)用
*/
public void funB(){
System.out.println("B、擴(kuò)充的funB()方法");
}
}
此程序在子類B
中定義的 funB()
方法在子類對(duì)象發(fā)生向上轉(zhuǎn)型時(shí)( A a = new B();
),父類對(duì)象將無法調(diào)用,也就是說這個(gè)方法是子類自己的特殊功能,并沒有在父類中定義,如果此時(shí)要想調(diào)用子類中的方法,就必須將父類對(duì)象向下轉(zhuǎn)型。
// 范例 10: 向下轉(zhuǎn)型,調(diào)用子類中的特殊功能
public class TestDemo {
public static void main(String args[]){
fun(new B());//向上轉(zhuǎn)型,只能調(diào)用父類中定義的方法
}
public static void fun(A a){
B b = (B)a; //要調(diào)用子類的特殊操作,需要向下轉(zhuǎn)型
b.funB(); //調(diào)用子類的擴(kuò)充方法
}
}
程序執(zhí)行結(jié)果:
B、擴(kuò)充的funB()方法
此程序如果要調(diào)用 fun()
方法,則子類B
的實(shí)例化對(duì)象一定要發(fā)生向上轉(zhuǎn)型操作,但是這個(gè)時(shí)候父類對(duì)象無法調(diào)用子類B
的 funB()
方法,所以需要進(jìn)行向下轉(zhuǎn)型才能正常調(diào)用 funB()
方法。但是如果每一個(gè)子類都去大量擴(kuò)充自己的新功能,這樣就會(huì)嚴(yán)重破環(huán)開發(fā)的參數(shù)統(tǒng)一性,所以方法應(yīng)該以父類為主,子類可以覆寫父類方法,但盡量不要擴(kuò)充新的方法。
通過以上所有分析可以發(fā)現(xiàn)如下特點(diǎn):
向上轉(zhuǎn)型:其目的是參數(shù)的統(tǒng)一,但是向上轉(zhuǎn)型中,通過子類實(shí)例化后的父類對(duì)象所能調(diào)用的方法只能是父類中定義過的方法;
向下轉(zhuǎn)型:其目的是父類對(duì)象要調(diào)用實(shí)例化它的子類中的特殊方法,但是向下轉(zhuǎn)型是需要強(qiáng)制轉(zhuǎn)換的,這樣的操作容易帶來安全隱患。
以個(gè)人經(jīng)驗(yàn)來說,對(duì)于對(duì)象的轉(zhuǎn)型,實(shí)際上 80%的情況下都只會(huì)使用向上轉(zhuǎn)型,因?yàn)榭梢缘玫絽?shù)類型的統(tǒng)一,方便于程序設(shè)計(jì);并且子類定義的方法大部分情況下應(yīng)該以父類的方法名稱為標(biāo)準(zhǔn)進(jìn)行覆寫,而不要過多地?cái)U(kuò)充方法。5% 的情況下會(huì)使用向下轉(zhuǎn)型,目的是調(diào)用子類的特殊方法。還有15%的情況下是不轉(zhuǎn)型,例如:String
。
2.3 關(guān)鍵字 instanceof
為了保證轉(zhuǎn)型的順利進(jìn)行,Java 提供了一個(gè)關(guān)鍵字:instanceof
,利用此關(guān)鍵字可以判斷某一個(gè)對(duì)象是否是指定類的實(shí)例,使用格式如下。
// 返回boolean型
對(duì)象 instanceof 類
如果某個(gè)對(duì)象是某個(gè)類的實(shí)例,就返回 true
, 否則返回 false
。
// 范例 11: 使用instanceof 判斷
public class TestDemo {
public static void main(String args[]){
A a = new B(); //對(duì)象向上轉(zhuǎn)型
System.out.println(a instanceof A);
System.out.println(a instanceof B);
System.out.println(null instanceof A);
}
}
程序執(zhí)行結(jié)果:
true
true
false
此程序利用 instanceof
判斷了某個(gè)對(duì)象是否是指定類的實(shí)例,通過程序的執(zhí)行結(jié)果可以發(fā)現(xiàn) a
對(duì)象由于采用了向上轉(zhuǎn)型進(jìn)行實(shí)例化操作,所以 a
是 A
類或 B
類的實(shí)例化對(duì)象,而 null
在使用 instanceof
判斷時(shí)返回的結(jié)果為 false
。
既然 instanceof
關(guān)鍵字可以準(zhǔn)確地判斷出實(shí)例化對(duì)象與類的關(guān)系,那么就可以在進(jìn)行對(duì)象強(qiáng)制轉(zhuǎn)換前進(jìn)行判斷,以保證安全可靠的向下轉(zhuǎn)型操作。
從實(shí)際的開發(fā)來講,向下轉(zhuǎn)型的操作幾乎是很少見到的,但是如果真的出現(xiàn)了,并且開發(fā)者不確定此操作是否安全時(shí),一定要先使用instanceof
關(guān)鍵字判斷。
// 范例 12: 使用 instanceof 判斷
class A{
public void print(){
System.out.println("A、public void print(){}");
}
}
class B extends A{ //定義A 的子類
public void print(){ //此時(shí)子類覆寫了父類中的print()方法
System.out.println("B、public void print(){}");
}
public void funB(){
System.out.println("B、擴(kuò)充的funB()方法");
}
}
public class TestDemo {
public static void main(String args[]){
fun(new B());
}
public static void fun(A a){ //對(duì)象向上轉(zhuǎn)型
a.print();
if (a instanceof B){ //如果 a 對(duì)象是B 類的實(shí)例
B b= (B)a; //向下轉(zhuǎn)型
b.funB(); //調(diào)用子類擴(kuò)充的方法
}
}
}
程序執(zhí)行結(jié)果:
B、public void print(){}
B、擴(kuò)充的funB()方法
在此程序中為了保證安全的向下轉(zhuǎn)型操作,在將父類轉(zhuǎn)換為子類對(duì)象時(shí)首先使用了 instanceof
進(jìn)行判斷,如果當(dāng)前對(duì)象是子類實(shí)例,則進(jìn)行強(qiáng)制轉(zhuǎn)換,以調(diào)用子類的擴(kuò)充方法。
?? 總結(jié)
在本文中我們學(xué)習(xí)了Java中兩個(gè)重要的概念:final
關(guān)鍵字和多態(tài)性。
首先,我們了解到final
關(guān)鍵字可以應(yīng)用于類、方法和屬性。final
類表示不可繼承,final
方法表示不可覆蓋,而final
屬性表示不可修改。使用final
關(guān)鍵字可以提高代碼的安全性和性能,并明確表達(dá)設(shè)計(jì)意圖。
其次,我們探討了多態(tài)性的概念。多態(tài)性是面向?qū)ο缶幊痰闹匾匦裕渲邪ㄏ蛏限D(zhuǎn)型、向下轉(zhuǎn)型和關(guān)鍵字instanceof
。通過向上轉(zhuǎn)型,我們可以實(shí)現(xiàn)參數(shù)的統(tǒng)一和代碼的靈活性。而向下轉(zhuǎn)型則允許調(diào)用子類的個(gè)性化操作方法。關(guān)鍵字instanceof
則可用于檢查對(duì)象是否屬于某個(gè)類或其子類的實(shí)例。
理解final
關(guān)鍵字和多態(tài)性對(duì)于Java開發(fā)至關(guān)重要。它們能幫助我們?cè)O(shè)計(jì)更安全、靈活且易于維護(hù)的代碼。合理運(yùn)用final
關(guān)鍵字,可以防止不必要的修改和繼承;深入理解多態(tài)性,可以提高代碼的可擴(kuò)展性和可復(fù)用性。
最后,我們需要注意在使用final
關(guān)鍵字時(shí)要謹(jǐn)慎,并根據(jù)具體需求進(jìn)行選擇。同時(shí),熟練掌握多態(tài)性的概念和技巧,有助于編寫更具有彈性和適應(yīng)性的代碼。

到了這里,關(guān)于【Java基礎(chǔ)教程】(十四)面向?qū)ο笃?· 第八講:多態(tài)性詳解——向上及向下轉(zhuǎn)型、關(guān)鍵字 final與 instanceof的作用~的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!