1. 程式人生 > >java提高篇(二)-----理解java的三大特性之繼承

java提高篇(二)-----理解java的三大特性之繼承

      在《Think in java》中有這樣一句話:複用程式碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言,僅僅能夠複製程式碼並對加以改變是不夠的,它還必須能夠做更多的事情。在這句話中最引人注目的是“複用程式碼”,儘可能的複用程式碼使我們程式設計師一直在追求的,現在我來介紹一種複用程式碼的方式,也是java三大特性之一---繼承。

繼承

繼承—01

      從這裡我們可以看出,Wife、Husband兩個類除了各自的husband、wife外其餘部分全部相同,作為一個想最大限度實現複用程式碼的我們是不能夠忍受這樣的重複程式碼,如果再來一個小三、小四、小五……(扯遠了大笑

)我們是不是也要這樣寫呢?那麼我們如何來實現這些類的可複用呢?利用繼承!!

      首先我們先離開軟體程式設計的世界,從常識中我們知道丈夫、妻子、小三、小四…,他們都是人,而且都有一些共性,有名字、年齡、性別、頭等等,而且他們都能夠吃東西、走路、說話等等共同的行為,所以從這裡我們可以發現他們都擁有人的屬性和行為,同時也是從人那裡繼承來的這些屬性和行為的。

      從上面我們就可以基本瞭解了繼承的概念了,繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承我們能夠非常方便地複用以前的程式碼,能夠大大的提高開發的效率。

繼承—02

      對於Wife、Husband使用繼承後,除了程式碼量的減少我們還能夠非常明顯的看到他們的關係。

      繼承所描述的是“is-a”的關係,如果有兩個物件A和B,若可以描述為“A是B”,則可以表示A繼承B,其中B是被繼承者稱之為父類或者超類,A是繼承者稱之為子類或者派生類。

      實際上繼承者是被繼承者的特殊化,它除了擁有被繼承者的特性外,還擁有自己獨有得特性。例如貓有抓老鼠、爬樹等其他動物沒有的特性。同時在繼承關係中,繼承者完全可以替換被繼承者,反之則不可以,例如我們可以說貓是動物,但不能說動物是貓就是這個道理,其實對於這個我們將其稱之為“向上轉型”,下面介紹

      誠然,繼承定義了類如何相互關聯,共享特性

。對於若干個相同或者相識的類,我們可以抽象出他們共有的行為或者屬相併將其定義成一個父類或者超類,然後用這些類繼承該父類,他們不僅可以擁有父類的屬性、方法還可以定義自己獨有的屬性或者方法。

      同時在使用繼承時需要記住三句話:

         1、子類擁有父類非private的屬性和方法。

         2、子類可以擁有自己屬性和方法,即子類可以對父類進行擴充套件。

        3、子類可以用自己的方式實現父類的方法。以後介紹)。

      綜上所述,使用繼承確實有許多的優點,除了將所有子類的共同屬性放入父類,實現程式碼共享,避免重複外,還可以使得修改擴充套件繼承而來的實現比較簡單。

      誠然,講到繼承一定少不了這三個東西:構造器、protected關鍵字、向上轉型。

構造器

      通過前面我們知道子類可以繼承父類的屬性和方法,除了那些private的外還有一樣是子類繼承不了的---構造器。對於構造器而言,它只能夠被呼叫,而不能被繼承。 呼叫父類的構造方法我們使用super()即可。

      對於子類而已,其構造器的正確初始化是非常重要的,而且當且僅當只有一個方法可以保證這點:在構造器中呼叫父類構造器來完成初始化,而父類構造器具有執行父類初始化所需要的所有知識和能力。

public class Person {
    protected String name;
    protected int age;
    protected String sex;
    
    Person(){
        System.out.println("Person Constrctor...");
    }
}

public class Husband extends Person{
    private Wife wife;

    Husband(){
        System.out.println("Husband Constructor...");
    }
    
    public static void main(String[] args) {
        Husband husband  = new Husband();
    }
}

Output:
Person Constrctor...
Husband Constructor...

      通過這個示例可以看出,構建過程是從父類“向外”擴散的,也就是從父類開始向子類一級一級地完成構建。而且我們並沒有顯示的引用父類的構造器,這就是java的聰明之處:編譯器會預設給子類呼叫父類的構造器。

      但是,這個預設呼叫父類的構造器是有前提的:父類有預設構造器。如果父類沒有預設構造器,我們就要必須顯示的使用super()來呼叫父類構造器,否則編譯器會報錯:無法找到符合父類形式的構造器。

public class Person {
    protected String name;
    protected int age;
    protected String sex;
    
    Person(String name){
        System.out.println("Person Constrctor-----" + name);
    }
}

public class Husband extends Person{
    private Wife wife;

    Husband(){
        super("chenssy");
        System.out.println("Husband Constructor...");
    }
    
    public static void main(String[] args) {
        Husband husband  = new Husband();
    }
}

Output:
Person Constrctor-----chenssy
Husband Constructor...

     所以綜上所述:對於繼承而已,子類會預設呼叫父類的構造器,但是如果沒有預設的父類構造器,子類必須要顯示的指定父類的構造器,而且必須是在子類構造器中做的第一件事(第一行程式碼)。

protected關鍵字

      private訪問修飾符,對於封裝而言,是最好的選擇,但這個只是基於理想的世界,有時候我們需要這樣的需求:我們需要將某些事物儘可能地對這個世界隱藏,但是仍然允許子類的成員來訪問它們。這個時候就需要使用到protected。

      對於protected而言,它指明就類使用者而言,他是private,但是對於任何繼承與此類的子類而言或者其他任何位於同一個包的類而言,他卻是可以訪問的

public class Person {
    private String name;
    private int age;
    private String sex;

    protected String getName() {
        return name;
    }

    protected void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return "this name is " + name;
    }
    
    /** 省略其他setter、getter方法 **/
}

public class Husband extends Person{
    private Wife wife;

    public  String toString(){
        setName("chenssy");    //呼叫父類的setName();
        return  super.toString();    //呼叫父類的toString()方法
    }

    public static void main(String[] args) {
        Husband husband = new Husband();
        
        System.out.println(husband.toString());
    }
}

Output:
this name is chenssy

      從上面示例可以看書子類Husband可以明顯地呼叫父類Person的setName()。

      誠然儘管可以使用protected訪問修飾符來限制父類屬性和方法的訪問許可權,但是最好的方式還是將屬性保持為private(我們應當一致保留更改底層實現),通過protected方法來控制類的繼承者的訪問許可權

向上轉型

      在上面的繼承中我們談到繼承是is-a的相互關係,貓繼承與動物,所以我們可以說貓是動物,或者說貓是動物的一種。這樣將貓看做動物就是向上轉型。如下:

public class Person {
    public void display(){
        System.out.println("Play Person...");
    }
    
    static void display(Person person){
        person.display();
    }
}

public class Husband extends Person{
    public static void main(String[] args) {
        Husband husband = new Husband();
        Person.display(husband);      //向上轉型
    }
}

      在這我們通過Person.display(husband)。這句話可以看出husband是person型別。

       將子類轉換成父類,在繼承關係上面是向上移動的,所以一般稱之為向上轉型。由於向上轉型是從一個叫專用型別向較通用型別轉換,所以它總是安全的,唯一發生變化的可能就是屬性和方法的丟失。這就是為什麼編譯器在“未曾明確表示轉型”活“未曾指定特殊標記”的情況下,仍然允許向上轉型的原因。

謹慎繼承

      上面講了繼承所帶來的諸多好處,那我們是不是就可以大肆地使用繼承呢?送你一句話:慎用繼承

      首先我們需要明確,繼承存在如下缺陷:

         1、父類變,子類就必須變

         2、繼承破壞了封裝,對於父類而言,它的實現細節對與子類來說都是透明的

         3、繼承是一種強耦合關係

      所以說當我們使用繼承的時候,我們需要確信使用繼承確實是有效可行的辦法。那麼到底要不要使用繼承呢?《Think in java》中提供瞭解決辦法:問一問自己是否需要從子類向父類進行向上轉型。如果必須向上轉型,則繼承是必要的,但是如果不需要,則應當好好考慮自己是否需要繼承

      慎用繼承!!!!!!!!!!!!!!!!!!!!!!!!!!!

相關推薦

【轉】java提高()-----理解java三大特性繼承

logs 了解 向上轉型 one 調用 adding nbsp eight 基礎 【轉】java提高篇(二)-----理解java的三大特性之繼承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在《Thi

java提高()-----理解java三大特性繼承

      在《Think in java》中有這樣一句話:複用程式碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言,僅僅能夠複製程式碼並對加以改變是不夠的,它還必須能夠做更多的事情。在這句話中最引人注目的是“複用程式碼”,儘可能的複用程式碼使我們程式設計師一直在追求的,現在我來介紹一種複用程式

轉:java提高(一)-----理解java三大特性封裝

nss 一般來說 隱藏 source 沒有 實例 十個 影響 角度 轉 CSDN https://blog.csdn.net/chenssy/article/details/12757911?utm_source=blogxgwz0 從大二接觸java開始,到現在也差

java提高(四)-----理解java三大特性多型 --- 轉載至http://www.cnblogs.com/chenssy/p/3372798.html

java提高篇(四)-----理解java的三大特性之多型       面向物件程式設計有三大特性:封裝、繼承、多型。  &n

java提高(一)-----理解java三大特性封裝

      從大二接觸java開始,到現在也差不多三個年頭了。從最基礎的HTML、CSS到最後的SSH自己都是一步一個腳印走出來的,其中開心過、失落過、寂寞過。雖然是半道出家但是經過自己的努力也算是完成了“學業”。期間參加過培訓機構,但是極其不喜歡那種培訓方式,於是毅然的放棄了選擇自學(可憐我出了6000塊錢

轉:java提高(四)-----理解java三大特性多態

優先級 這一 否則 封裝 https 繼續 aid 類方法 void 作者: chenssy 出處: http://www.cnblogs.com/chenssy/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原

java提高-----理解java三大特性繼承

《Think in java》中有這樣一句話:複用程式碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言,僅僅能夠複製程式碼並對加以改變是不夠的,它還必須能夠做更多的事情。在這句話中最引人注目的是“複用程式碼”,儘可能的複用程式碼使我們程式設計師一直在追求的,現

Java學習筆記十一:Java面向對象的三大特性繼承

類構造 接下來 多重 通過 prot 圖片 等級 ++ class Java面向對象的三大特性之繼承 一:繼承的概念;   繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。   繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父

理解java三大特性繼承

對象實例化 rgs 子類 name [] cto per 更改 成員變量 繼承是所有OOP語言不可缺少的部分,在java中使用extends關鍵字來表示繼承關系。當創建一個類時,總是在繼承,如果沒有明確指出要繼承的類,就總是隱式地從根類Object進行繼承。java語言不支

JAVA三大特性 繼承詳解

類和類之間的常見關係。 既然繼承是描述類和類之間的關係,就需要先來了解類和類之間的常見關係 ​​​​​​​現實生活的整體與部分 舉例說明 現實生活 學生   是人   狗     是動物

java面向物件三大特性繼承

1、繼承 1 .1、繼承的總說明 1、子類繼承父類,可以繼承父類的全部屬性和方法( 除了父類的構造方法) 2、java只有單繼承一個子類只有一個父類不能有多個父類(c+±-) 3、如果定義一個類沒有

Java提高(八):實現多重繼承

public class Son { /** * 內部類繼承Father類 */ class Father_1 extends Father{ public int strong(){ return super.stron

java提高-----詳解java的四捨五入與保留位

      四捨五入是我們小學的數學問題,這個問題對於我們程式猿來說就類似於1到10的加減乘除那麼簡單了。在講解之間我們先看如下一個經典的案例: public static void main(St

第二十四、Java面向物件三大特性繼承與super關鍵字

面向物件的三大特徵:1. 封裝2. 繼承3. 多型. 1、類和類之間的常見關係     1:既然繼承是描述類和類之間的關係,就需要先來了解類和類之間的常見關係 1.1  現實生活的整體與部分 舉例說明 1:現實生活     1:學生   是人      2:狗    

Java三大特性繼承

不能 font clas span end 構造方法 類的繼承 構造 哪裏 二、類的繼承 1. 概念:從已有的類中派生出新的類,新的類能吸收已有類的屬性和行為,並能擴展新的能力。 2. 一個不由任何類派生出來的類稱為基類,一個派生類最近的上層類稱為該類的父類,從某一類派

python學習_day24_面向對象三大特性繼承

wan 桌子 python super 特性 sub zhong 多重 family 一、繼承的定義   繼承在python中是創建一種新類的方法,新建的類可以繼承一個或者多個父類,其中父類稱為超類或者基類,新建的類稱為派生類或者子類。繼承表達的是什麽是什麽的關系,如:高桌

python面向對象三大特性繼承、多態

nim 類的屬性 pri dog name 復用性 繼承 python2 調用方法 繼承 什麽是繼承     所謂繼承指提供了同一類對象共性的處理方法,子類繼承父類共性的東西。 這樣有利於代碼的復用性,即子類擁有父類的方法。通過繼承創建的新類稱為“子類”或“

python的三大特性繼承

繼承 繼承是一種建立新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類 python中類的繼承分為:單繼承和多繼承 class ParentClass1: #定義父類 pass class ParentClass2

【C++】:面向物件三大特性繼承

面向物件三大特性之繼承 1.繼承的概念及定義 2.基類和派生類物件賦值相互轉化 3.繼承時的作用域 4.派生類中的預設成員函式 5.繼承的友元和靜態成員 6.菱形繼承和菱形虛擬繼承 7.組合和繼承 1.繼承的概念

Java提高理解java三大特性——多態

調用 logs child fun 同時 不存在 .cn 暴露 並且 面向對象編程有三大特性:封裝、繼承、多態。 封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了數據。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。 繼承是為