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

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

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] 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩一区三区 | 国产人人艹 | 五月婷婷丁香色 | 精品国产乱码久久久久久免费 | 亚洲系列国产系列 | 狠狠干快播| 精品久久久久久影院免费 | 日本卡一卡2卡3卡4精品卡无人区 | 奇米影视小说 | 美女被视频 | 日日夜夜撸影院 | 99久久er这里只有精品17 | 午夜AV亚洲一码二中文字幕青青 | 护士被多人调教到失禁h | xxnx日本免费护士 | 久久精选视频 | 欧美国产精品 | 欧美a欧美1级 | 国产青草视频在线观看免费影院 | 国产成人激烈叫床视频 | 女烈受刑重口小说 | 大学第一次基本都没了 | 天天色综合6 | 色播影院性播影院私人影院 | 国产精品嫩草影院在线 | 娇小XXXXX第一次出血 | 国产成人精品日本亚洲网站 | 男人和女人日 | 精品久久久久国产免费 | 91热国产| 午夜成私人影院在线观看 | 国产尤物精品视频 | 日本黄大片影院一区二区 | 国产精品拍拍拍福利在线观看 | 风间由美在线 | 亚洲第一区欧美日韩精品 | 亚洲国产成人精品激情 | 给我免费的视频在线观看 | tiny4k欧美极品在线 | 国产成人精品系列在线观看 | 国产 日韩 欧美视频二区 |