Java繼承機制

Java繼承機制

繼承是面向對象最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行爲,並能擴展新的能力。

Java繼承是使用已存在的類的定義作爲基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。

繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。

Java繼承是面向對象的最顯著的一個特徵。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行爲,並能擴展新的能力。

類和類之間的繼承關係可以用UML符號表示,其中父類又叫超類或基類,子類又叫派生類。父類是子類的一般化,子類是父類的特化(具體化)。

JAVA不支持多繼承,單繼承使JAVA的繼承關係很簡單,一個類只能有一個父類,易於管理程序,同時一個類可以實現多個接口,從而克服單繼承的缺點。

繼承分類

Java繼承分爲單繼承和多重繼承。單繼承是指一個子類最多只能有一個父類。多繼承是一個子類可以有二個以上的父類。由於多繼承會帶來二義性,在實際應用中應儘量使用單繼承。Java語言中的類只支持單繼承,而接口支持多繼承。Java中多繼承的功能是通過接口(interface)來間接實現的。
在這裏插入圖片描述

繼承的作用

繼承機制主要具有雙重作用:一是作爲類的構造機制,二是作爲類型的構造機制。

作爲類的構造機制,繼承通過擴充、組合現有的類來構造新的類。擴充是指形成現有類的特例——派生類,組合是指抽取出若干現有類的共性形成新的抽象層次——基類。

作爲類型的構造機制,如果子類繼承父類,則所有要求對象爲父類類型的地方也可以接受子類類型的對象。也就是說父類對象出現的地方可以用子類對象替代。

作爲類的構造機制,繼承是面向對象程序設計語言中支持軟件重用的一種重要方式,而作爲類型構造機制,繼承是實現動態多態性的基礎。

繼承的語法

Java中用保留字extends表示繼承關係。繼承的語法格式爲:

public class 子類 extends 父類{
    //子類新增的數據成員和方法
    //子類重寫父類的成員和方法

重定義

當子類要用到超類中的一個方法,而超類的這個方法有不適合子類時,我們可以選擇在子類中重定義這個方法。子類重定義超類的方法是指的方法是指在子類中定義一個與超類的某個方法有完全相同接口的方法,這是稱子類的這個方法重定義了超類同接口的方法。所爲方法接口完全相同是指返回類型、方法名和方法參數列表完全相同。向以上例子中,Manager類的getSalary()方法就是重定義了超類Employee的getSalary()方法。

在重定義超類(祖先類)的方法時,不允許降低方法的訪問控制權限。如在超類中是public的方法,在子類重定義時不能定義成protected或private。不過java允許在子類中重定義成員數據是降低其訪問控制權限。如在超類中是public的數據成員,在子類可重定義爲protected或private的數據成員。

對於成員數據來說,只要子類定義了與祖先類同名的成員數據就是重定義了祖先類的成員數據,而且屏蔽了祖先類的成員數據,子類及子類的使用者再也不能訪問該祖先類的成員數據。

this與super

java中的this與super都是每一個對象實例中的特殊私有成員,是一個引用變量,this的類型是該對象實例所屬的類類型,super的類型是它所屬的對象實例的超類類型。

它們有兩種使用方式:

第一種:調用類的數據或方法成員。this是調用自身的成員,而super則是調用其超類(祖先類)中的數據成員。

    public class Employee {
        private String name;
        ......
        public Employee(String name,double s,int year,int month,int day){
            this.name=name;
            .........
        }
        .......

在構造函數中用到了this.name=name;,this指明瞭name是它所在的類(Employee)中定義的name,而不是參數列表中的那個name。這種使用方法的格式總結爲:this.本類成員 和 super.超類成員。其中超類成員不能是私有成員。

第二種:調用構造函數。this是在自身的構造函數中調用自身的另一個構造函數,而super則是在自身的構造函數中調用其超類的構造函數。例如Manager類的構造函數:

    public Manager(String name,double s,int year,int month,int day){
        super(name, s, year, month, day);//必須放在第一句
        this.bonus=0;
    }

其中有super(name, s, year, month, day);,這是Manager的構造函數調用了其超類Employee的構造函數,初始化了繼承成員name、salary、hireDay。這種使用方法的格式總結爲:this(參數列表);和 super(參數列表);。注意,他們都必須放在構造方法的第一句。

總結

子類擁有父類非private的屬性,方法。

子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。

子類可以用自己的方式實現父類的方法(重定義)。

Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。但接口允許多繼承。

提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯繫)。

參考文章:
Java繼承
java的繼承機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章