Java,extends,繼承

來源:互聯網
上載者:User

標籤:並且   四種   重寫   順序   void   string   pack   oid   層級   

1. 繼承的概念:

  繼承在本職上是特殊——一般的關係。子類繼承父類,表明子類是一種特殊的父類,並且具有父類所不具有的一些屬性或方法。

2. 繼承中的初始化順序:

  從類的結構上而言,其內部可以有如下四種常見形態:屬性(包括類屬性和執行個體屬性)、方法(包括類方法和執行個體方法)、構造器和初始化塊(包括類的初始化塊和執行個體的初始化塊)。對於繼承中的初始化順序,又具體分為類的初始化和對象的初始化。

  類初始化:

  在jvm裝載類的準備階段,首先為類的所有類屬性和類初始化塊分配記憶體空間。並在類首次初始化階段中為其進行初始化,類屬性和類初始化塊之間的定義時的順序決定了其初始化的順序。若類存在父類,則首先初始化父類的類屬性和類初始化塊,一直上溯到Object類最先執行。

  對象初始化:

  在new建立對象時,首先對對象屬性和初始化塊分配記憶體,並執行預設初始化。如果存在父類,則先為父類對象屬和初始化塊先分配記憶體並執行初始化。然後執行父類構造器中的初始化程式,接著才開始對子類的對象屬性和初始化塊執行初始化。

注意:

  1. 在對象初始化階段,屬性和方法均針對子類可以從父類繼承過來的屬性和方法而言,一般而言,都是針對父類中非private而言的。

因為private修飾的為父類所特有的,子類沒有繼承過來,當new子類時,無須為其分配空間並執行初始化。當然了,父類的構造器子類也是不繼承過來的,

但構造器另當別論。

  2. 類的初始化只執行一次,當對同一個類new多個對象時,類屬性和類初始化塊只初始化一次。

3.繼承中的修飾符以及屬性隱藏

  Java類具有三種存取控制符:private、protected和public,同時當不寫這三個存取控制符時,表現為一種預設的存取控制狀態。因此,一共具有四種存取控制層級。

具體存取控制表現如下:

  private修飾的屬性或方法為該類所特有,在任何其他類中都不能直接存取;

  預設不寫,這類修飾的屬性或方法具有包訪問特性,同一個包中的其他類可以訪問;

  protected修飾的屬性或方法在同一個中的其他類可以訪問,同時對於不在同一個包中的子類中也可以訪問;

  public修飾的屬性或方法外部類中都可以直接存取。

  當子類繼承父類,子類可以繼承父類中具有存取控制許可權的屬性和方法(一般來說是非private修飾的),對於private修飾的父類所特有的屬性和方法,子類是不繼承過來的。

  當子類需要改變繼承過來的方法時,也就是常說的重寫父類的方法。一旦重寫後,父類的此方法對子類來說表現為隱藏。以後子類的對象調用此方法時,都是調用子類重寫後

的方法,但子類對象中想調用父類原來的此方法時,可以通過如下兩種方式:

  1.將子類物件類型強制轉化為父類類型,進行調用;

  2.通過super調用。

  同樣的,如果在子類中定義父類中相同名稱的屬性時,父類屬性在子類中表現為隱藏。

4.繼承中的this和super:

  構造器中的this表示當前正在初始化的對象引用,方法中的this表示當前正在調用此方法的對象引用。this具體用法表現在一下幾個方面:

  1.當具多個重載的構造器時,且一個構造器需要調用另外一個構造其,在其第一行使用this(param)形式調用,且只能在第一行;

  2.當對象中一個方法需要調用本對象中其他方法時,使用this作為主調,也可以不寫,實際上預設就是this作為主調;

  3.當對象屬性和方法中的局部變數名稱相同時,在該方法中需要顯式的使用this作為主調,以表示對象的屬性,若不存在此問題,可以不顯式的寫this。

  其實,其牽涉到的一個問題就是變數的尋找規則:先局部變數 => 當前類中定義的變數 => 其父類中定義的可以被子類繼承的變數 => 父類...

  super表示調用父類中相應的屬性和方法。在方法中,若需要調用父類的方法時,也一定要寫在第一行

 總例:

package com.wen1227;public class Niao {    private String name;    private int age;        public Niao(String name){        this.name=name;    }    public Niao(String name,int age){        this.name=name;        this.age=age;    }    public String getName(){        return name;    }    public void  setName(String name){         this.name=name;    }    public int getAge(){        return age;    }    public void setAge(int age){        this.age=age;    }            public void Zou(){        System.out.println(name+"正在走路");    }}

  建立一個Niao的類給他定義一個name和age的屬性寫為private私人的。

  然後這裡定義了兩個建構函式進行重載,一個有一個參數,一個有兩個參數。

  因為上面定義的屬性name和age都是私人的(private),所以後面子類繼承的時候無法繼承到這些屬性,那麼就需要在父類中定義一個方法來擷取name和age再定義一個方法來改變name和age的內容。

  最後再定義一個Zou的方法讓他輸出一個內容。

package com.wen1227;public class XiQue extends Niao {    public XiQue(String name){        super(name);    }    public XiQue(String name,int age){        super(name,age);    }        public void Zou(){        super.Zou();        System.out.println(this.getName()+"feifeifeifeifei"+this.getAge());    }}

  這裡定義了一個XiQue作為子類繼承了父類Niao的屬性, 這裡同樣也寫了兩個建構函式來進行重載,但是子類XiQie裡面沒有name和age的內容,只能調用父類的,所以這裡定義的建構函式例就用到了super屬性。

  同樣在子類XiQue裡面有一個方法Zou,然後寫一個super調用父類的Zou屬性(從結果上你就會一目瞭然),只是對Zou的屬性進行了修改,這叫重寫。

package com.wen1227;public class Test {    public static void main(String[] args) {        XiQue x =new XiQue("張三",3);        x.Zou();        Niao n =new Niao("lisi");        n.Zou();    }}

  最後採用一個main函數調用,先new一個XiQue,讓其進行XiQue的Zou,然後new一個Niao,讓其進行Niao的Zou,最後輸出的結果為

張三正在走路張三feifeifeifeifei3lisi正在走路

  因為先調用了XiQue的,他裡面先調用了super.Zou();所以先輸出父類的,然後再執行XiQue的System.out.println(this.getName()+"feifeifeifeifei"+this.getAge());最後再執行父類的Zou。 所以是三行,一目瞭然。

5. 繼承與組合:

  從單純的實現效果上看,繼承和組合都能達到同樣的目的。並且都是實現代碼複用的有效方式。

  但在一般性的概念層次中,兩者具有較為明顯的差別。

  繼承表現為一般——特殊的關係,子類是一個特殊的父類,是is-a的關係。父類具有所有子類的一般特性。

  組合表現為整體——部分關係。在組合中,通過將“部分”單獨抽取出來,形成自己的類定義,並且在“整體”

  這個類定義中,將部分定義為其中的一個屬性,並通過get和set方法,以此可以調用“部分”類中的屬性和方法。

Java,extends,繼承

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.