1. 程式人生 > >Java學習筆記(三):面向對象

Java學習筆記(三):面向對象

default 直接 imp 尋找 bst 構造 時也 fin 不同

1.繼承

  • 語法

    class 父類{}
    class 子類 extends 父類{}
    只能多層繼承,不能多重繼承,子類不能直接訪問父類中的私有成員,可通過getter和setter方法獲得
  • 子類對象new實例化(時)
  1. 會默認先調用父類的構造方法,再調用子類的構造方法去實例化所以,若父類和子類構造方法裏含有輸出語句,會在new時都打印
  2. 實際上,子類構造裏隱含了super();調用了父類構造
  • 方法的覆寫(“方法重寫”)
  1. 子類覆寫的方法不能擁有比父類方法更加嚴格的訪問權限
    (如:父類--public ,子類也必須是--public )
  2. 父類方法被子類方法覆寫後,如何訪問該父類方法?
    ```
  3. 使用super();關鍵字即可,如:super.print();
  4. 在子類中,直接通過“super.方法()”形式即可訪問父類中的方法
    ```
  5. .特例:private-->到default不算覆寫,而是重新定義了一個新的方法!
  • 屬性的覆寫
  1. 繼承後重新定義屬性,同覆寫方法一致
  2. 特別:在子類中:

    1.super.name-->訪問父類中的name屬性
    2.this.name-->訪問“本“類中的name屬性
  • 重載與覆寫的區別
  1. 重載:

    01.方法名相同參數類型或個數不同
    02.對權限沒有要求
    03.發生在同一個類中
  2. 覆寫:

    01.方法名稱,參數類型相同
    02.被覆寫的方法(即子類方法)不能擁有(比父類方法)更嚴格的訪問權限
    03.發生在繼承類中
  • super關鍵字的作用
  1. super調用父類構造

    **同this一樣,該語句必須放在構造方法的句首**
  2. this與super的區別:

this:

01.屬性:調用本類中的屬性,若沒有,則從父類中尋找
02.方法:調用本類中的方法,若沒有,則從父類中尋找
03.構造:調用本領構造,必須放在構造方法的首行
04.特殊:表示當前的對象

super:

01.屬性:訪問父類中的屬性
02.方法:直接訪問父類中的方法
03.構造:調用父類構造,必須放在子類的構造方法裏的首行,如:super();
  • final關鍵字

註意:

1. 使用final聲明的“類‘’不能有子類
2. 使用final聲明的”方法”不能被子類所覆寫
3. 使用final聲明的變量即為常量,常量不可修改!
4. public static final同時聲明的變量稱為全局”常“量

2.抽象類

  • 定義規則
    ```
  1. 包含一個抽象方法的類必須是抽象類
  2. 抽象類和抽象方法都要使用abstract關鍵字聲明
  3. 抽象方法只需聲明而不需要實現
  4. 抽象類必須被子繼承,子類(如果不是抽象類)必須覆寫抽象類中的全部抽象方法
  5. 抽象類不能直接實例化,必須經由非抽象子類進行子類的實例化
    ```
  • 定義格式
    ```
  1. 抽象類:abstract class A {}
  2. 抽象方法:訪問權限 abstract 返回值類型 方法名稱(參數);
    //在抽象方法中是沒有方法體的,不需要{}
  3. 子類的定義方法:class B extends A{ }
    在子類還必須覆寫抽象類中的全部抽象方法
  4. 註意:抽象方法不要用private關鍵字聲明,因為抽象方法必須被子類覆寫
  5. 本質:抽象類比普通類多了個抽象方法,除了不能直接進行對象的實例化操作外其實並沒有不同
    ```

    3.接口

  • 組成:
  1. 最重要的概念之一
  2. 由全局常量和公共的抽象方法組成

    interface 接口名稱 {
    全局常量;
    抽象方法;
    }
  3. 此處的抽象方法必須定義為public 訪問權限,不可更改!!!
  4. 當然,也可不寫,默認public ,而不是default
  5. 通常,我們知道,全局常量是public static final,抽象方法是public abstract,但此處特殊,默認所以可省略該定義,實際上還有的

interface A{
    String s="作者"; //定義全局常量
    void print(); //定義抽象方法
    String getInfo(); //抽象方法不需{}
}
  • 接口的使用
  1. class 子類名 implements 接口A,接口B{ } !!!
    一個子類可以實現多個接口,class A implements B,C{}
  2. 實現後,必須覆寫全部抽象方法
  • 接口的繼承
  1. 一個接口不能繼承抽象類,但一個接口允許繼承多個接口

    interface A{} interface B{} interface C extends B,C{}
  2. 即一個接口可以同時繼承多個接口,註意是繼承extends!!!
  3. 接口不能實現接口,可以實現繼承

    4.對象的多態性

  • 兩種
  1. 方法的重載和覆寫
  2. 對象的多態性
    01.向上轉型:子類對象-->父類對象,會自動完成
    02.向下轉型:父類對象-->子類對象,必須指定轉型的子類類型
  • 格式
  1. 對象向上轉型:父類 父類對象 =子類實例;

    如:B b =new B(); //子類實例化過程
      A a =b; //向上轉型
  2. 對象向下轉型:子類 子類對象 =(子類)父類實例;

    如:A a =new B(); //向上轉型
    B b =(B)a; //向下轉型:A-->B
  • 調用:調用子類自己的方法,一定只能用子類的實例化對象
  • 註意:!!!在進行對象的向下轉型前,必須首先發生對象的向上轉型,否則將異常
  • 讀法:一個程序要從右到左:

    如:A a =new B();
    是B實例化了一個對象,該B的對象再向上轉型成為了A的對象a

    5.instanceof關鍵字

  • 用於判斷一個對象到底是誰哪個類的實例
  1. 對象 instanceof 類 -->返回boolean值
  • 用途:
  1. 如下:

    A a1=new B(); 
    A a2=new A();
    01.a1同時是A和B的對象-->通過子類實例化的對象同時也是父類和子類的實例,所以可以直接向上或向下轉型
    02.a2只是A的對象 -->此時不能向下轉型,因為沒有先向上轉型-->直接使用父類實例化本類對象,就不再是子類實例了,所以不能轉型
  2. 向下轉型前進行判斷操作,避免異常
    ```
    A a=new B();
    if( a instanceof B){ }

Java學習筆記(三):面向對象