Java的三大特性之繼承

此處我會分爲這幾個部分來理解繼承是怎麼樣的:html

一、區分封裝、繼承和多態java

二、區分限定詞的範圍面試

三、區分隱藏、覆蓋、重載函數

四、繼承的理解ui

五、一道面試題的原型spa

---------------------------------------這裏是友好的分隔線----------------------------------------code

通常咱們都會說Java的三大特性有:封裝、繼承、多態。如今先來捋順一下它們的概念加以區分。htm

封裝對象

封裝就是將類的信息隱藏在類內部,不容許外部程序直接訪問,而是經過該類的方法實現對隱藏信息的操做和訪問。blog

能夠這麼理解:

一、封裝能夠把一個對象的屬性私有化,同時能夠選擇性地提供能夠被外界訪問的方法(getter、setter)。

二、封裝可使咱們更容易地對一個對象的內部進行操做。

三、封裝可讓咱們對成員變量進行更爲精準的控制,像是對成員變量使用限定符,還有判斷屬性值的合法性。

 

繼承

繼承是類與類的一種關係,是使用已存在的類的頂底做爲基礎創建新類的技術。新類的定義能夠增長新的數據或新的功能,也可使用父類的功能,不能選擇性地繼承父類,可是父類能夠選擇性地讓子類繼承一些屬性。

能夠這麼理解:

一、父類擁有的「財產」可讓子類來繼承,可是父類有權利選擇給子類繼承多少「財產」,而子類沒有權利選擇性地繼承父類給的「財產」。

二、子類也能夠經過本身的雙手去創造本身的「財富」,能夠對父類的「財產」進行擴展。

三、子類能夠經過「覆蓋」、「隱藏」來實現自身的特殊的價值(後文會重點提到)。

另外,對於繼承來講有三個關鍵字不得不提:構造器、protected、向上轉型,後文會說起。

 

多態

多態指的是對象的多種形態。多態有兩種:引用多態和方法多態。繼承是多態的實現基礎。

一、引用多態

父類的引用能夠指向本類的對象;父類的引用能夠指向子類的對象。

public class Test{
  public static void main(String[] args){
    //父類的引用能夠指向本類的對象 Animal ani1
= new Animal();
    //父類的引用能夠指向子類的對象 Animal ani2
= new Dog(); } }

二、方法多態

建立父類對象時,調用的方法爲父類方法;

建立子類對象時,調用的方法是子類重寫的方法或繼承自父類的方法;

 

參考:

https://www.cnblogs.com/BoscoGuo/p/5877185.html

 

---------------------------------這裏是友好的分隔線-----------------------------------

咱們所說的限定詞有四種,public、protected、默認、private。

這裏就簡單說一下他們的區別。

範圍

public

protected

默認

private

同類

 

 

 

 

同包子類

 

 

 

 

非同包子類

 

 

 

 

非同包非子類

 

 

 

 

(注意:這裏重點區分一下protected和默認的區別)

 

參考:http://blog.51cto.com/ironkui/1755385

-------------------------------------------這裏是友好的分隔線-----------------------------------------

接下來咱們來了解一下隱藏、覆蓋和重載的區別

重載

重載是方法名相同,可是參數不一樣的多個同名函數

  注意:參數不一樣的意思是指參數類型、參數個數和參數順序之中至少有一個不一樣,可是返回值和異常已經訪問修飾符不能算做是重載的條件,另外main方法也仍是能夠重載的。

 

覆蓋

覆蓋是子類重寫父類的方法,要求方法名和參數類型徹底同樣(參數不能是子類),返回值和異常比父類小或者是相同(即爲父類的子類),限定符範圍比父類的大或者相同。

  注意:子類實例方法不能覆蓋父類的靜態方法;子類的靜態方法也不能覆蓋父類的實例方法。

 

隱藏

隱藏是指當父類和子類擁有相同名字的屬性或者方法時,父類的同名的屬性或者方法形式上不見了,實際上仍是存在的。

  注意:父類的實例變量和靜態變量能被子類的同名變量隱藏;父類的靜態方法被子類的同名靜態方法隱藏;父類的實例方法被子類的同名實例變量覆蓋

  也就是說,不能用子類的靜態方法覆蓋父類中一樣簽名(參數簽名徹底同樣)的實例方法;不能用子類的實例方法覆蓋父類中一樣表示的靜態方法;變量只能被隱藏而不會被覆蓋。

 

隱藏和覆蓋的區別

  被隱藏的屬性,在子類被強制轉換成父類以後,訪問的是父類中的屬性。

  被覆蓋的方法,在子類被強制轉換成父類後,調用的仍是子類自身的方法。

 

參考:

https://www.cnblogs.com/it12345/p/5221673.html

https://www.cnblogs.com/xiaoQLu/archive/2013/01/07/2849869.html

---------------------------------這裏是友好的分隔線-----------------------------------

繼承

在java中使用extends關鍵字來表示繼承關係。當建立一個類時,老是在繼承,若是沒有明確指出要繼承的類,就老是隱式地繼承根類Object。

若是兩個類存在繼承關係,那麼子類會自動繼承父類的方法和變量,在子類中能夠調用父類的方法和變量。在java中只容許單繼承,可是一個類卻能夠被多個類繼承,也就說是,一個男人能夠有多個兒子可是他的兒子只能認他爲親爹。

 

一、子類繼承父類的成員變量也不是所有的變量均可以繼承到的。

  ① 父類用private修飾的成員變量不能繼承。

  ② 對於父類的包訪問權限成員變量,要跟父類在同一個包下子類才能繼承它。

  ③ 若是子類和父類中都出現了同名稱的成員變量,則會發生隱藏現象,子類的成員變量會屏蔽掉父類的同名成員變量。若是要在子類中訪問父類的同名成員變量,須要使用super關鍵字進行引用。

二、子類繼承父類的方法一樣也是有條件的。

  ① 父類用private修飾的成員方法不能繼承。

  ② 對於父類的包訪問權限成員方法,要跟父類在同一個包下子類才能繼承它。

  ③ 若是子類和父類中都出現了同名稱的成員方法,則會發生覆蓋現象,子類的成員方法會覆蓋掉父類的同名成員方法。若是要在子類中訪問父類的同名成員方法,須要使用super關鍵字進行引用。

(注意:隱藏是針對成員變量和靜態方法的,而覆蓋是針對普通方法的)

三、構造器:子類是不可以繼承父類的構造器

  ① 若是父類的構造器都是帶有參數的,則必須在子類的構造器中顯示地使用super來調用父類的構造器。

  ② 若是父類有無參構造器,則在子類的構造器中用super關鍵字調用父類構造器不是必須的,由於系統會自動調用父類的無參構造器。

 

參考:

https://www.cnblogs.com/dolphin0520/p/3803432.html

-------------------------------這裏是友好的分隔線-----------------------------------

接下來是一道面試題的原型,看看你能不能作對?

public class Test03 {
    public static void main(String[] args) {
        Son son = new Son();
    }
}
class Parent{
    static{
        System.out.println("Static Parent.");
    }
    public Parent(){
        System.out.println("Parent Block");
    }
}
class Son extends Parent{
    static{
        System.out.println("Static Son.");
    }
    public Son(){
        System.out.println("Son Block.");
    }
}

答案:

相關文章
相關標籤/搜索