javaSE_11_繼承初識

知識框架

繼承概述

繼承是面向對象三大特徵之一,封裝居首位,封裝以後造成了獨立體,獨立體 A和獨立體B 之間可能存在繼承關係。其實程序中的繼承靈感來自於現實生活,在現實生活中繼承到處可見,例如,兒子繼承了父親的財產,兒子不須要努力就頗有錢。java

生活中的繼承:框架

繼承時子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的屬性,或子類從父類繼承方法,使得子類具備與父類相同的行爲。兔子和羊屬於食草動物類,獅子和豹屬於食肉動物類。食草動物和食肉動物又是屬於動物類。因此繼承須要符合的關係是:is-a(Bird is-aAnimal),父類更通用,子類更具體。雖然食草動物和食肉動物都是屬於動物,可是二者的屬性和行爲上有差異,因此子類會具備父類的通常特性也會具備自身的特性。測試

定義this

  • 就是子類繼承父類的屬性和行爲,使得子類對象具備與父類相同的屬性、相同的行爲。子類能夠直接訪問父類中的非私有的屬性和行爲。

如何繼承

經過 extends 關鍵字,能夠聲明一個子類繼承另一個父類,定義格式以下:spa

代碼示例:code

複製代碼; "複製代碼")對象

package com.wrg; // 定義員工類Employee,作爲父類
class Employee { // 定義name屬性
String name; // 定義員工的工做方法blog

public void work() {
    System.out.println("全力以赴地工做");
}

} /** * 定義講師類Teacher 繼承 員工類Employee */
class Teacher extends Employee { // 定義一個打印name的方法繼承

public void printName() {
    System.out.println("name=" + name);
}

} //定義測試類內存

public class ExtendsTest { public static void main(String[] args) { // 建立一個子類對象

Teacher t = new Teacher(); // 爲該員工類的name屬性進行賦值
    t.name = "小明"; // 調用該員工的 // printName()方法
    t.printName(); // name = 小明 // 調用Teacher類繼承來的work()方法
    t.work(); // 全力以赴地工做

}
}

複製代碼; "複製代碼")

好處

  • 提升了代碼的複用性(多個類相同的成員能夠放到同一個類中)
  • 提升了代碼的維護性(若是方法的代碼須要修改,修改一處便可)
  • 繼承的出現讓類與類之間產生了關係,提供了多態的前提。
  • 繼承的做用中除了可讓代碼複用以外,還有很是重要的兩個做用,那就是有了繼承以後纔會衍生出方法的覆蓋和多態機制。

注意:不要僅爲了獲取其餘類中某個功能而去繼承

子類的特色

  • 子類繼承了父類,就繼承了父類的方法和屬性。
  • 在子類中,可使用父類中定義的方法和屬性,也能夠建立新的數據和方法。
  • 在Java 中,繼承的關鍵字用的是「extends」,即子類不是父類的子集,而是對父類的「擴展」。

繼承的規則:

B類繼承 A類,則稱 A類爲超類(superclass)、父類、基類,B類則稱爲子類(subclass)、派生類、擴展類。

子類不能直接訪問父類中私有的(private)的成員變量和方法。

Java只支持單繼承和多層繼承,不容許多重繼承

  • 一個子類只能有一個父類
  • 一個父類能夠派生出多個子類

class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2...//error

                    

java 中規定,子類繼承父類,除構造方法不能繼承以外,剩下均可以繼承。可是私有的屬性沒法在子類中直接訪問。(父類中private修飾的不能在子類中直接訪問。能夠經過間接的手段來訪問。)

java 中的類沒有顯示的繼承任何類,則默認繼承 Object類,Object類是 java 語言提供的根類(老祖宗類),也就是說,一個對象與生俱來就有 Object類型中全部的特徵。

繼承的弊端

  • 繼承讓類與類之間產生了關係,類的耦合性加強了,當父類發生變化時子類實現也不得不跟着變化,削弱了子類的獨立性

繼承的應用場景

  • 使用繼承,須要考慮類與類之間是否存在is..a的關係,不能盲目使用繼承。is..a的關係:誰是誰的一種,例如:老師和學生是人的一種,那人就是父類,學生和老師就是子類

繼承中成員方法的訪問特色

本質上,子類繼承父類以後,是將父類繼承過來的方法歸爲本身全部。實際上調用的也不是父類的方法,是他子類本身的方法(由於已經繼承過來了就屬於本身的)。

經過子類對象訪問一個方法

  1. 先去子類成員範圍找
  2. 在去父類成員範圍找
  3. 若是都沒有就報錯(不考慮父親的父親…)

繼承中變量的訪問特色

在子類方法中訪問一個變量,採用的是就近原則。

  1. 先去子類局部範圍找
  2. 在去子類成員範圍找
  3. 以後去父類成員範圍找
  4. 若是都沒有就報錯(不考慮父親的父親…)

繼承中構造方法的訪問特色

  • 子類中全部的構造方法默認都會訪問父類中無參的構造方法
  • ​子類會繼承父類中的數據,可能還會使用父類的數據。因此,子類初始化以前,必定要先完成父類數據的初始化,緣由在於,每個子類構造方法的第一條語句默認都是:super()
  • 構造方法的名字是與類名一致的。因此子類是沒法繼承父類構造方法的
  • 對象在堆內存中,會單獨存在一塊super區域,用來存放父類的數據

問題:若是父類中沒有無參構造方法,只有帶參構造方法,該怎麼辦呢?

  • 經過使用super關鍵字去顯示的調用父類的帶參構造方法
  • 在父類中本身提供一個無參構造方法

總結一下

this丶super關鍵字:

  • this:表明本類對象的引用
  • super:表明父類存儲空間的標識(能夠理解爲父類對象引用)

三種用法

      

this和super的區別

       

相關文章
相關標籤/搜索