JAVA 學習模塊十一: 繼承

這裏寫圖片描述

1.基本形式和概念

/*
優點:
1.提高了代碼的複用性
2.讓類與類之間產生了關係,給第三個特徵多態提供了前提


java 中支持單繼承,不直接支持多繼承,但對c++中的多繼承機制進行了改良

單繼承: 一個子類只有一個直接父類
多繼承: 一個子類可以有多個直接父類(Java中不允許)
         不支持是因爲多個父類中有相同成員,會產生調用不確定性

java 支持多層(重)繼承:
    c繼承b ,b繼承a
    就會出現繼承體系

當要使用一個繼承體系時:
1.查看該體系中的頂層類,瞭解該體系的基本功能
2.創建體系中的最子類的對象,完成功能的使用。


什麼時候定義繼承:

當類與類之間有所屬關係時,就定義繼承。





*/

class Peeson
{
    String name;
    int age;


}


class Student extends Person //繼承
{
//  String name;
//  int age;
    void study()
    {
    System.out.println(name +"st");


    }

}

class Worker

{
    String name;
    int age;
    void work()
    {
        System.out.println(name+ "wo");

    }


}

class Extend

{
    public static void main(String[] args)
    {
        Student s = new Student();
        s.name = "zhangsan";
        s.age=20;
        s.student();



    }



}

2.繼承的具體使用

/*
在子父類中。成員的特點體現。
1.成員函數
2.成員變量
3.構造函數


*/

/*
當本類的成員和局部變量同名用this區分。
當子父類的成員變量同名用super區分父類。
this和super用法很相似:關鍵字

區別:
this 代表一個本類對象的引用
super: 代表一個父類的空間


*/
//成員變量
class Fu
{
    private int num1 = 4;
    public int getNum()
    {
        return num1;
    }


}





class Zi extends Fu
{
//  int num2 =  5;
    int num1 = 4;
    void show()
    {
        System.out.println(this.num1+"..."+super.getNum());

    }




}





class ExtendDemo
{
    public static void main(String[] args)
    {
        Zi z = new Zi();
        z.show();
    }



}


//成員函數

/*
當子父類中出現成員函數一模一樣的情況,會運行子類的函數。
這種現象稱爲覆蓋操作。這是函數在子父類中的特性。
函數兩個特性:1.重載(同一個類中)/重寫/覆寫 2. 覆蓋(子類中)


覆蓋注意事項:
1.子類覆蓋父類方法時,子類權限必須大於等於父類權限。(public private修飾的不可覆蓋)
2.靜態只能覆蓋靜態或者被靜態覆蓋。



什麼時候使用覆蓋:

*/
 class Fu1
 {
    void show1()
     {
        System.out.println("fu show run");
    }


 }

 class Zi extends Fu
 {

     void show1()
     {
        System.out.println("zi show run");
    }
 }

 class ExtendsDemo3
 {

     public static void main(String[] args)
     {
        Zi z = new Zi();
        z.show1();
        z.show2();

     }
 }


 /*
 什麼時候使用覆蓋:
 當對一個類進行子類的擴展時,子類需要保留父類的功能聲明。
 但是要定義子類中標特有的功能時,就要用覆蓋操作完成。


 */

 class Phone
 {
    void show()
     {
        System.out.println("number");
    }

 }



 class NewPhone extends Phone
 {
    void show()
     {
        System.out.println("name");
//      System.out.println("number");
        super.show();


    }

 }


 /*子父類中的構造函數的特點

 在子類構造對象時,發現在訪問子類構造函數時,父類也就運行了。
 原因是:
 在子類的構造函數中第一行有個默認的隱式語句。super()


 構造函數不可覆蓋,不可繼承

爲什麼子類實例化的時候要訪問父類中的構造函數:
那是因爲子類繼承了父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的
內容進行初始化的。所以子類在完成構造函數時,必須訪問父類中的構造函數。
爲了完成必須的動作,就在子類構造函數中加了 super()語句。


如果父類中沒有定義空參數構造函數,那麼子類的構造函數,必須用super明確調用父類中的那個構造函數。
同時子類構造函數中如果使用了this調用了本類構造函數時,那麼super 就沒有了因爲 super 和 this 都只能定義在第一行,所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數(構造函數可以有多個)。、
注意:super語句必須要定義在子類構造函數的第一行。因爲父類的初始化動作要先完成。


 */

 class Fu1
 {
    Fu()
        {
        System.out.println("zi show run");
    }


 }

 class Zi extends Fu
 {

     Zi()
     {
         //super(); 調用的就是父類中的空參數的調用涵數。
         //如果不是空參,那麼就用  super(參數) 的形式
        System.out.println("zi show run");
    }
 }

 class ExtendsDemo4
 {

     public static void main(String[] args)
     {
        new Zi();

     }
 }


3.一個對象實例化的過程

/*
一個對象實例化的過程

Person p = new Person();

1. jvm 會讀取指定的路徑下的 Person.class 文件,並加載進內存,並會
先加載 Person 的父類(如果有父類的情況下)
2.在堆內存中開闢空間,分配地址
3.並在對象空間中,對對象中的屬性進行默認初始化。
4.調用對應的構造函數進行初始化
5.在構造函數中,第一行會先調用父類中的構造函數進行初始化
6.父類初始化完畢後,再對子類的屬性進行顯示初始化
7.再進行子類構造函數的特定初始化
8.初始化完畢後,將地址值付給引用變量
9.

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