隱身衣揭祕--java中繼承/隱藏/覆寫

故事背景java

看過《哈利·波特》的娃們,想必必定還記得電影中的「隱形斗篷」。。這件隱形衣是哈利收到的聖誕禮物,也是死亡聖器中的三件套之一,它讓哈利小盆友在執行任務的過程當中簡直是如虎添翼!ide

隱身衣揭祕--java中繼承/隱藏/覆寫

 

其實說白了,隱身衣所包裹的就是人類本能的掌控欲與窺探欲,咱們渴望知道和了解全部事,但不少時候又不想讓別人知道,因此咱們須要「隱身衣」。。spa

 

隱身衣揭祕--java中繼承/隱藏/覆寫

 繼承Inheritance/隱藏hide/覆寫overridecode

java中有繼承Inheritance/隱藏hide/覆寫override的概念,咱們暫且無論他們的區別,先看看最近發生的一件小事,boss在開會時說錯了一個數字,Leader趕忙說:」那是我弄錯的「,程序猿想找到Boss說的數字時,卻怎麼也不行,這是怎麼回事呢?請看案情回放:blog

public class Conference {
    public static void main(String[] args) {
        System.out.println(new Leader().sales);
    }
}
class Boss {
    public Integer sales=10000;
}
class Leader extends Boss{
    private Integer sales=9000;
}

咋一看,會打印Leader的銷售量數據9000,但仔細分析來看,Leader類的sales變量是私有的,程序不能編譯經過。該程序確實不能編譯,可是錯誤出在Conference類中。緣由:在Conference中調用的是new Leader()即leader的實例,不是Leader類,一個覆寫方法的訪問修飾符所提供的訪問權限與被覆寫方法的訪問修飾符所提供的訪問權限相比,至少要同樣多[JLS 8.4.8.3]。繼承

由於sales是一個域,因此Leader.sales隱藏(hide)了Boss.sales,而不是覆蓋了它[JLS 8.3]。對一個域來講,當它要隱藏另外一個域時,若是隱藏域的訪問修飾符提供的訪問權限比被隱藏域的少,儘管這麼作不可取的,可是它確實是合法的。it

其實咱們仍是能夠找到老闆的所說的sales的。以下:io

public class Conference {
    public static void main(String[] args) {
        System.out.println(((Boss)new Leader()).sales);
    }
}
class Boss {
    public Integer sales=10000;
}
class Leader extends Boss{
    private Integer sales=9000;
}

總結編譯

覆寫與隱藏之間的一個很是大的區別。一旦一個方法在子類中被覆寫,你就不能在子類的實例上調用它了(除了在子類內部,經過使用super 關鍵字來方法)。然而,你能夠經過將子類實例轉型爲某個超類類型來訪問到被隱藏的域,在這個超類中該域未被隱藏。class

參考資料

【1】java解惑

【2】https://www.sohu.com/a/231064552_764920

相關文章
相關標籤/搜索