1. 程式人生 > >複習筆記06 介面與多型

複習筆記06 介面與多型

1 介面

1.1 介面的概述

介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。

介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。

1.2 介面的格式&使用

1.2.1 介面的格式

 與定義類的class不同,介面定義時需要使用interface關鍵字。

定義介面所在的仍為.java檔案,雖然宣告時使用的為interface關鍵字的編譯後仍然會產生.class檔案。這點可以讓我們將介面看做是一種只包含了功能宣告的特殊類。

定義格式:

public interface 介面名 {

抽象方法1;

抽象方法2;

抽象方法3;

}

 

1.2.2 介面的使用

介面的方法全是抽象方法,直接new介面來呼叫方法沒有意義,Java也不允許這樣幹

類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用implements

其他類(實現類)實現介面後,就相當於宣告:”我應該具備這個介面中的功能”。實現類仍然需要重寫方法以實現具體的功能。

格式:

class implements 介面 {

重寫介面中方法

}

在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。

1.3 介面中成員的特點

1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。

2、介面中可以定義方法,方法也有固定的修飾符,public abstract

3、介面不可以建立物件。

4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以例項化。否則子類是一個抽象類。

 

1.4 介面和類的關係

 

A:類與類之間:繼承關係,一個類只能直接繼承一個父類,但是支援多重繼承

B:類與介面之間:只有實現關係,一個類可以實現多個介面

C:介面與介面之間:只有

繼承關係,一個介面可以繼承多個介面

1.5 介面優點

 

1.類與介面的關係,實現關係,而且是多實現,一個類可以實現多個介面,類與類之間是繼承關係,java中的繼承是單一繼承,一個類只能有一個父類,打破了繼承的侷限性。

2.對外提供規則

3.降低了程式的耦合性(可以實現模組化開發,定義好規則,每個人實現自己的模組,提高了開發的效率)

1.6 介面和抽象類的區別

1.共性:

  不斷的進行抽取,抽取出抽象的,沒有具體實現的方法,都不能例項化(不能建立物件)

2.區別

1: 與類的關係

類與介面是實現關係,而且是多實現,一個類可以實現多個介面,類與抽象類是繼承關係,Java中的繼承是單一繼承,多層繼承,一個類只能繼承一個父類,但是可以有爺爺類

2: 成員

  a.成員變數

    抽象類可以有成員變數,也可以有常量

    介面只能有常量,預設修飾符public static final

  b.成員方法

    抽象類可以有抽象方法,也可以有非抽象方法

    介面只能有抽象方法,預設修飾符 public abstract

  c.構造方法

    抽象類有構造方法,為子類提供

    介面沒有構造方法

2 匿名物件&final

2.1 匿名物件定義&使用

匿名物件:沒有名字的物件

匿名物件的應用場景:

  當方法只調用一次的時候可以使用匿名物件

  可以當作引數進行傳遞,但是無法在傳參之前做其他的事情

注意:匿名物件可以呼叫成員變數並賦值,但是賦值並沒有意義

2.2 final關鍵字

   final:修飾符,可以用於修飾類、成員方法和成員變數

   final所修飾的類:不能被繼承,不能有子類

   final所修飾的方法:不能被重寫

   final所修飾的變數:是不可以修改的,是常量

3 多型

3.1 多型的定義與使用格式

多型的定義格式:就是父類的引用變數指向子類物件

父類型別  變數名 = new 子類型別();

變數名.方法名();

 

A:普通類多型定義的格式

父類 變數名 = new 子類();

如: class Fu {}

class Zi extends Fu {}

//類的多型使用

Fu f = new Zi();

B:抽象類多型定義的格式

抽象類 變數名 = new 抽象類子類();

如: abstract class Fu {

         public abstract void method();

     }

class Zi extends Fu {

public void method(){

      System.out.println(“重寫父類抽象方法”);

}

}

//類的多型使用

Fu fu= new Zi();

 

C:介面多型定義的格式

介面 變數名 = new 介面實現類();

如: interface Fu {

     public abstract void method();

}

class Zi implements Fu {

     public void method(){

              System.out.println(“重寫介面抽象方法);

}

}

//介面的多型使用

Fu fu = new Zi();

3.2 多型成員的特點

多型的成員特點:

 成員變數  編譯時看的是左邊,執行時看的左邊

 成員方法  編譯時看的是左邊,執行時看右邊

 靜態方法  編譯時看的是左邊,執行時看的也是左邊

 編譯時看的都是左邊,執行時成員方法看的是右邊,其他(成員變數和靜態的方法)看的都是左邊

 

3.3 多型向上轉型與向下轉型

多型的轉型分為向上轉型與向下轉型兩種:

A:向上轉型:當有子類物件賦值給一個父類引用時,便是向上轉型,多型本身就是向上轉型的過程。

使用格式:

父類型別  變數名 = new 子類型別();

如:Person p = new Student();

B:向下轉型:一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接建立父類物件,是無法向下轉型的

使用格式:

子類型別 變數名 = (子類型別) 父類型別的變數;

:Student stu = (Student) p;  //變數p 實際上指向Student物件