JAVA中阻止類的繼承(官方和非官方)
官方辦法
JAVA語言提供的一個(gè)關(guān)鍵字“FINAL”可以用來履行該任務(wù)。看看下面的源代碼范例:
//FinalDemo.java
public final class FinalDemo {
}
下面讓我們來制作另一個(gè)類,它將會(huì)繼承上面聲明的類。JAVA語言提供的“EXTENDS”關(guān)鍵字將能夠使得一個(gè)類繼承于一個(gè)現(xiàn)有的類。
//FinalDemo2.java
public class FinalDemo2 extends FinalDemo {
}
在編譯第一個(gè)類后,如果你接著編譯第二個(gè)類,那么JDK編譯器報(bào)錯(cuò),你會(huì)得到下列錯(cuò)誤信息:
FinalDemo2.java:1: cannot inherit from final FinalDemo
public class FinalDemo2 extends FinalDemo{}
^
1 error
現(xiàn)在,你已經(jīng)通過官方辦法來成功阻止了第一個(gè)類被另一個(gè)類所繼承。
非官方辦法
但是,阻止類被其他類所繼承的辦法也不是唯一的??紤]下面的代碼,我聲明了構(gòu)造方法為私有(private)的, 而且也聲明了一個(gè)靜態(tài)方法(static method)來返回一個(gè)類對(duì)象。
public class PrivateTest{
private PrivateTest(){
System.out.println("Private Default Constructor");
}
public static PrivateTest getInstance(){
return new PrivateTest();
}
}
上面被修改的代碼被稱為是"Singleton模式," 一個(gè)getInstance方法總是只返回這個(gè)類的一個(gè)實(shí)例。 但是為什么這段代碼阻止了類被繼承呢?考慮下面的代碼,聲明的類應(yīng)該能繼承上面的類。
public class PrivateTest2 extends PrivateTest{
}
在編譯第一個(gè)類后,如果你接著編譯第二個(gè)類,那么JDK編譯器報(bào)錯(cuò),你會(huì)得到下列錯(cuò)誤信息:
PrivateTest2.java:1: PrivateTest() has private access in PrivateTest
public class PrivateTest2 extends PrivateTest{
^
1 error
第二個(gè)類不能繼承第一個(gè)類。 但是提示錯(cuò)誤的意思是什么呢? JAVA語言要求在一個(gè)類中至少要提供一個(gè)構(gòu)件方法。 如果你沒有提供任何構(gòu)件方法, JDK將會(huì)在你聲明的類中插入一個(gè)默認(rèn)的構(gòu)件方法。 換句話說,默認(rèn)的是一個(gè)不帶參數(shù),空構(gòu)件體,和一個(gè)公共(public)訪問權(quán)限的構(gòu)件方法。 但是,如果你自己定義了一個(gè)構(gòu)件方法, 那么JDK編譯器就不會(huì)插入這么默認(rèn)的構(gòu)件方法。我們剛才在PrivateTest類中聲明了一個(gè)默認(rèn)的構(gòu)件方法,但是我們將默認(rèn)的public訪問權(quán)限改為了private權(quán)限,這些都是符合JDK編譯器語法檢查的規(guī)則的。
現(xiàn)在我們來看看第二個(gè)部門。JAVA語言也要求你必須在構(gòu)件方法里的第一行來調(diào)用(call)超類(super class)的構(gòu)件方法。 這個(gè)是啟動(dòng)繼承特征所必須的。 在JAVA中,我們通過調(diào)用super()這個(gè)方法來完成這個(gè)任務(wù),它將會(huì)映射到一個(gè)超類的構(gòu)件方法中。 如果你沒有給超類提供一個(gè)默認(rèn)的構(gòu)造方法,那么JDK編譯器將會(huì)插入一個(gè)默認(rèn)的超類構(gòu)件方法用來調(diào)用。
我們剛才在第一個(gè)類中將構(gòu)造器聲明為private的權(quán)限?,F(xiàn)在,當(dāng)我們?cè)谄渌愔欣^承這個(gè)類的時(shí)候,編譯器將會(huì)嘗試調(diào)用一個(gè)默認(rèn)的超類構(gòu)件方法。因?yàn)槌惙秶鷥?nèi)的構(gòu)件方法是聲明為private權(quán)限的, 編譯器將報(bào)錯(cuò),說不能調(diào)用超類構(gòu)件方法。因此,我們通過非官方辦法阻止了一個(gè)類被其他類所繼承。
Usman Saleem
Mohammad Ali Jinnah University
E-mail: usman_saleem@yahoo.com
- Java內(nèi)部類的繼承(全)
- 基于java中子類的繼承性的應(yīng)用介紹
- java Person,Student,GoodStudent 三個(gè)類的繼承、構(gòu)造函數(shù)的執(zhí)行
- Java類的繼承實(shí)例詳解(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
- Java面向?qū)ο缶幊讨惖睦^承詳解
- java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法
- java中子類繼承父類,程序運(yùn)行順序的深入分析
- JAVA 繼承基本類、抽象類、接口介紹
- Java多線程繼承Thread類詳解
- 淺談java繼承中是否創(chuàng)建父類對(duì)象
- Java類的繼承原理與用法分析
相關(guān)文章
Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù)
這篇文章主要介紹了Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09全網(wǎng)最全SpringBoot集成swagger的詳細(xì)教程
swagger是當(dāng)下比較流行的實(shí)時(shí)接口文文檔生成工具,swagger分為swagger2?和swagger3兩個(gè)常用版本,二者區(qū)別不是很大,主要對(duì)于依賴和注解進(jìn)行了優(yōu)化,swagger2需要引入2個(gè)jar包,swagger3只需要一個(gè),用起來沒有什么大的區(qū)別,本文給大家詳細(xì)介紹,感興趣的朋友一起看看吧2022-08-08java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法示例
這篇文章主要介紹了java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法,結(jié)合實(shí)例形式分析了java正則判定、字符串遍歷及統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計(jì)算器的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中棧與綜合計(jì)算器的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2022-10-10