JAVA中阻止類的繼承(官方和非官方)
官方辦法
JAVA語言提供的一個關(guān)鍵字“FINAL”可以用來履行該任務(wù)??纯聪旅娴脑创a范例:
//FinalDemo.java
public final class FinalDemo {
}
下面讓我們來制作另一個類,它將會繼承上面聲明的類。JAVA語言提供的“EXTENDS”關(guān)鍵字將能夠使得一個類繼承于一個現(xiàn)有的類。
//FinalDemo2.java
public class FinalDemo2 extends FinalDemo {
}
在編譯第一個類后,如果你接著編譯第二個類,那么JDK編譯器報錯,你會得到下列錯誤信息:
FinalDemo2.java:1: cannot inherit from final FinalDemo
public class FinalDemo2 extends FinalDemo{}
^
1 error
現(xiàn)在,你已經(jīng)通過官方辦法來成功阻止了第一個類被另一個類所繼承。
非官方辦法
但是,阻止類被其他類所繼承的辦法也不是唯一的。考慮下面的代碼,我聲明了構(gòu)造方法為私有(private)的, 而且也聲明了一個靜態(tài)方法(static method)來返回一個類對象。
public class PrivateTest{
private PrivateTest(){
System.out.println("Private Default Constructor");
}
public static PrivateTest getInstance(){
return new PrivateTest();
}
}
上面被修改的代碼被稱為是"Singleton模式," 一個getInstance方法總是只返回這個類的一個實例。 但是為什么這段代碼阻止了類被繼承呢?考慮下面的代碼,聲明的類應(yīng)該能繼承上面的類。
public class PrivateTest2 extends PrivateTest{
}
在編譯第一個類后,如果你接著編譯第二個類,那么JDK編譯器報錯,你會得到下列錯誤信息:
PrivateTest2.java:1: PrivateTest() has private access in PrivateTest
public class PrivateTest2 extends PrivateTest{
^
1 error
第二個類不能繼承第一個類。 但是提示錯誤的意思是什么呢? JAVA語言要求在一個類中至少要提供一個構(gòu)件方法。 如果你沒有提供任何構(gòu)件方法, JDK將會在你聲明的類中插入一個默認的構(gòu)件方法。 換句話說,默認的是一個不帶參數(shù),空構(gòu)件體,和一個公共(public)訪問權(quán)限的構(gòu)件方法。 但是,如果你自己定義了一個構(gòu)件方法, 那么JDK編譯器就不會插入這么默認的構(gòu)件方法。我們剛才在PrivateTest類中聲明了一個默認的構(gòu)件方法,但是我們將默認的public訪問權(quán)限改為了private權(quán)限,這些都是符合JDK編譯器語法檢查的規(guī)則的。
現(xiàn)在我們來看看第二個部門。JAVA語言也要求你必須在構(gòu)件方法里的第一行來調(diào)用(call)超類(super class)的構(gòu)件方法。 這個是啟動繼承特征所必須的。 在JAVA中,我們通過調(diào)用super()這個方法來完成這個任務(wù),它將會映射到一個超類的構(gòu)件方法中。 如果你沒有給超類提供一個默認的構(gòu)造方法,那么JDK編譯器將會插入一個默認的超類構(gòu)件方法用來調(diào)用。
我們剛才在第一個類中將構(gòu)造器聲明為private的權(quán)限?,F(xiàn)在,當我們在其他類中繼承這個類的時候,編譯器將會嘗試調(diào)用一個默認的超類構(gòu)件方法。因為超類范圍內(nèi)的構(gòu)件方法是聲明為private權(quán)限的, 編譯器將報錯,說不能調(diào)用超類構(gòu)件方法。因此,我們通過非官方辦法阻止了一個類被其他類所繼承。
Usman Saleem
Mohammad Ali Jinnah University
E-mail: usman_saleem@yahoo.com
相關(guān)文章
Springboot如何實現(xiàn)自定義異常數(shù)據(jù)
這篇文章主要介紹了Springboot如何實現(xiàn)自定義異常數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09全網(wǎng)最全SpringBoot集成swagger的詳細教程
swagger是當下比較流行的實時接口文文檔生成工具,swagger分為swagger2?和swagger3兩個常用版本,二者區(qū)別不是很大,主要對于依賴和注解進行了優(yōu)化,swagger2需要引入2個jar包,swagger3只需要一個,用起來沒有什么大的區(qū)別,本文給大家詳細介紹,感興趣的朋友一起看看吧2022-08-08Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計算器的實現(xiàn)
這篇文章主要為大家詳細介紹了Java數(shù)據(jù)結(jié)構(gòu)中棧與綜合計算器的實現(xiàn),文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下2022-10-10