1. 程式人生 > >java面向對象(繼承)

java面向對象(繼承)

class phone 就是 ESS 問題 必須 工作 定義 關鍵字

一.繼承的概念

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

技術分享圖片

在Java中,類的繼承是指在一個現有類的基礎上去構建一個新的類,構建出來的新類被稱作子類,現有類被稱作父類,子類會自動擁有父類所有可繼承的屬性和方法

二.類繼承的格式

通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來

class 父類 {
}
 
class 子類 extends 父類 {
}

/*
 * 定義員工類Employee
 */
class Employee {
    String name; // 定義name屬性
    
// 定義員工的工作方法 public void work() { System.out.println("盡心盡力地工作"); } }
class Developer extends Employee {
    // 定義一個打印name的方法
    public void printName() {
        System.out.println("name=" + name);
    }
}
public class Example01 {
    public static void main(String[] args) {
        Developer d 
= new Developer(); // 創建一個研發部員工類對象 d.name = "小明"; // 為該員工類的name屬性進行賦值 d.printName(); // 調用該員工的printName()方法 d.work(); // 調用Developer類繼承來的work()方法 } }

技術分享圖片

Developer類通過extends關鍵字繼承了Employee類,這樣Developer類便是Employee類的子類。

子類雖然沒有定義name屬性和work()方法,但是卻能訪問這兩個成員

子類在繼承父類的時候,會自動擁有父類的成員

三.繼承的好處和

繼承類型

1.繼承的出現提高了代碼的復用性,提高軟件開發效率。

2.繼承的出現讓類與類之間產生了關系,提供了多態的前提。

技術分享圖片

四.繼承的特性

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

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

子類可以用自己的方式實現父類的方法。

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

提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系越緊密,代碼獨立性越差)。

五.繼承-子父類中成員變量的特點

class Fu
{
    //Fu中的成員變量。
    int num = 5;
}
class Zi extends Fu
{
    //Zi中的成員變量
    int num2 = 6;
    //Zi中的成員方法
    public void show()
    {
        //訪問父類中的num
        System.out.println("Fu num="+num);
        //訪問子類中的num2
        System.out.println("Zi num2="+num2);
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi(); //創建子類對象
        z.show(); //調用子類中的show方法
    }
}

Fu類中的成員變量是非私有的,子類中可以直接訪問,若Fu類中的成員變量私有了,子類是不能直接訪問的。

當子父類中出現了同名成員變量時,在子類中若要訪問父類中的成員變量,必須使用關鍵字super來完成。super用來表示當前對象中包含的父類對象空間的引用。

在子類中,訪問父類中的成員變量格式:
super.父類中的成員變量

class Fu
{
    //Fu中的成員變量。
    int num = 5;
}
class Zi extends Fu
{
    //Zi中的成員變量
    int num = 6;
    void show()
    {
        //子父類中出現了同名的成員變量時
        //在子類中需要訪問父類中非私有成員變量時,需要使用super關鍵字
        //訪問父類中的num
        System.out.println("Fu num="+super.num);
        //訪問子類中的num2
        System.out.println("Zi num2="+this.num);
    }
}
class Demo5 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi(); //創建子類對象
        z.show(); //調用子類中的show方法
    }
}

六.繼承-子父類中成員方法特點-重寫&應用

1.子父類中成員方法的特點:當在程序中通過對象調用方法時,會先在子類中查找有沒有對應的方法,若子類中存在就會執行子類中的方法,若子類中不存在就會執行父類中相應的方法。

class Fu{
    public void show(){
        System.out.println("Fu類中的show方法執行");
    }
}
class Zi extends Fu{
    public void show2(){
        System.out.println("Zi類中的show2方法執行");
    }
}
public  class Test{
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show(); //子類中沒有show方法,但是可以找到父類方法去執行
        z.show2();
    }
}

2.成員方法特殊情況——覆蓋:子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為override重寫、復寫或者覆蓋。

class Fu
{
    public void show()
    {
        System.out.println("Fu show");
    }
}
class Zi extends Fu
{
    //子類復寫了父類的show方法
    public void show()
    {
        System.out.println("Zi show");
    }
}

3.方法重寫(覆蓋)的應用

當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,即沿襲了父類的功能,又定義了子類特有的內容

在子類中,訪問父類中的成員方法格式:
super.父類中的成員方法();
public class Test {
    public static void main(String[] args) {
        new NewPhone().showNum();
    }
}

//手機類
class Phone{
    public void sendMessage(){
        System.out.println("發短信");
    }
    public void call(){
        System.out.println("打電話");
    }
    public void showNum(){
        System.out.println("來電顯示號碼");
    }
}

//智能手機類
class NewPhone extends Phone{
    
    //覆蓋父類的來電顯示號碼功能,並增加自己的顯示姓名和圖片功能
    public void showNum(){
        //調用父類已經存在的功能使用super
        super.showNum();
        //增加自己特有顯示姓名和圖片功能
        System.out.println("顯示來電姓名");
        System.out.println("顯示頭像");
    }
}

當描述一個手機時,它具有發短信,打電話,顯示來電號碼功能,後期由於手機需要在來電顯示功能中增加顯示姓名和頭像,這時可以重新定義一個類描述智能手機,並繼承原有描述手機的類。並在新定義的類中覆蓋來電顯示功能,在其中增加顯示姓名和頭像功能

七.方法重寫的註意事項

子類方法覆蓋父類方法,必須要保證權限大於等於父類權限。

class Fu(){    
void show(){}
    public void method(){}
}
class Zi() extends Fu{
public void show(){}  //編譯運行沒問題
    void method(){}      //編譯錯誤
}

寫法上稍微註意:必須一模一樣:方法的返回值類型 方法名 參數列表都要一樣。

當一個類是另一個類中的一種時,可以通過繼承,來繼承屬性與功能。如果父類具備的功能內容需要子類特殊定義時,進行方法重寫。

java面向對象(繼承)