一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - JAVA中阻止類的繼承(官方和非官方)

JAVA中阻止類的繼承(官方和非官方)

2019-11-01 14:16java教程網 JAVA教程

在面向對象的理論中, 有一些方案要求你用一個辦法來聲明一個不可繼承的類。一般而言,如果類提供的功能不應該被改變,或者更恰當的說,是被覆蓋(override)的時候才會出現這種情況。在這篇文章里,我討論在JAVA語言中的實現

官方辦法

JAVA語言提供的一個關鍵字“FINAL”可以用來履行該任務。看看下面的源代碼范例:

 

復制代碼代碼如下:

//FinalDemo.java 
public final class FinalDemo { 

 

    下面讓我們來制作另一個類,它將會繼承上面聲明的類。JAVA語言提供的“EXTENDS”關鍵字將能夠使得一個類繼承于一個現有的類。

 

復制代碼代碼如下:

//FinalDemo2.java 
public class FinalDemo2 extends FinalDemo { 
}   

 

在編譯第一個類后,如果你接著編譯第二個類,那么JDK編譯器報錯,你會得到下列錯誤信息:

FinalDemo2.java:1: cannot inherit from final FinalDemo 
public class FinalDemo2 extends FinalDemo{} 
                                ^ 
1 error


現在,你已經通過官方辦法來成功阻止了第一個類被另一個類所繼承。

非官方辦法

    但是,阻止類被其他類所繼承的辦法也不是唯一的。考慮下面的代碼,我聲明了構造方法為私有(private)的, 而且也聲明了一個靜態方法(static method)來返回一個類對象。

 

復制代碼代碼如下:

public class PrivateTest{ 
        private PrivateTest(){ 
                System.out.println("Private Default Constructor"); 
        } 
        public static PrivateTest getInstance(){ 
                return new PrivateTest(); 
        } 

 

    上面被修改的代碼被稱為是"Singleton模式," 一個getInstance方法總是只返回這個類的一個實例。 但是為什么這段代碼阻止了類被繼承呢?考慮下面的代碼,聲明的類應該能繼承上面的類。

public class PrivateTest2 extends PrivateTest{


}


在編譯第一個類后,如果你接著編譯第二個類,那么JDK編譯器報錯,你會得到下列錯誤信息:

PrivateTest2.java:1: PrivateTest() has private access in PrivateTest 
public class PrivateTest2 extends PrivateTest{ 
       ^ 
1 error


    第二個類不能繼承第一個類。 但是提示錯誤的意思是什么呢? JAVA語言要求在一個類中至少要提供一個構件方法。 如果你沒有提供任何構件方法, JDK將會在你聲明的類中插入一個默認的構件方法。 換句話說,默認的是一個不帶參數,空構件體,和一個公共(public)訪問權限的構件方法。 但是,如果你自己定義了一個構件方法, 那么JDK編譯器就不會插入這么默認的構件方法。我們剛才在PrivateTest類中聲明了一個默認的構件方法,但是我們將默認的public訪問權限改為了private權限,這些都是符合JDK編譯器語法檢查的規則的。 

    現在我們來看看第二個部門。JAVA語言也要求你必須在構件方法里的第一行來調用(call)超類(super class)的構件方法。 這個是啟動繼承特征所必須的。 在JAVA中,我們通過調用super()這個方法來完成這個任務,它將會映射到一個超類的構件方法中。 如果你沒有給超類提供一個默認的構造方法,那么JDK編譯器將會插入一個默認的超類構件方法用來調用。

    我們剛才在第一個類中將構造器聲明為private的權限。現在,當我們在其他類中繼承這個類的時候,編譯器將會嘗試調用一個默認的超類構件方法。因為超類范圍內的構件方法是聲明為private權限的, 編譯器將報錯,說不能調用超類構件方法。因此,我們通過非官方辦法阻止了一個類被其他類所繼承。

Usman Saleem 
Mohammad Ali Jinnah University 
E-mail: [email protected] 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久精品日日 | 91寡妇天天综合久久影院 | 处女呦呦| 岛国片免费看 | 欧洲女同同性videos0 | 亚洲AV中文字幕无码久久 | 成年人在线观看视频免费 | 日日日操 | 亚洲成人福利网站 | 色呦呦tv | 五月激激激综合网色播免费 | 国产成人亚洲影视在线 | 国产福利片在线 | 精品视频在线免费播放 | 亚洲精品一 | 国产精品啪啪 | 村上里沙40分钟在线观看 | 国产一级在线观看视频 | 欧美日韩一区二区三区韩大 | 国产亚洲视频在线 | 黑人又大又硬又粗再深一点 | 欧美日韩精品在线观看 | 久久99国产精品二区不卡 | 脱jk裙的美女露小内内无遮挡 | 好爽好紧小雪别夹小说 | 国产黄频在线观看高清免费 | 精品亚洲国产一区二区 | 亚洲激情综合 | 天天干夜夜噜 | www.色.con| 美女在尿口隐私视频 | 美国videos | 97蜜桃网 | 91普通话国产对白在线 | 欧美亚洲第一页 | 国产精品露脸国语对白99 | 色欲麻豆国产福利精品 | 国产精品香蕉夜间视频免费播放 | 国产高清一区二区 | 亚洲乱码一二三四五六区 | 国产精品久久国产精品99盘 |