天天看點

第二階段-Java面向對象:【第五章 接口】

5.1

接口概述

常見的貓狗案例 貓和狗它們僅僅提供一些基本功能。

但有一些不是動物本身就具備的,比如:貓鑽火圈,狗跳高等功能

是在後面的培養中訓練出來的,這種額外的功能,java提供了接口表示。

第二階段-Java面向對象:【第五章 接口】

5.2

接口特點

A:接口用關鍵字interface表示

[public] interface 接口名{
 }           

複制

1. 接口中的方法不能具體實作,接口中的方法必須為抽象方法

2. 接口中一般不定義變量,因為接口中的變量會被預設指定為 public static final 變量(隻能是)

B:類實作接口用implements 表示

class 類名 implements 接口1,接口2,[....]{
 }           

複制

1.一個類(非抽象類)可以遵循多個接口,并且需要實作(重寫)該接口中所有的方法

2.子類為抽象類的意義不大

第二階段-Java面向對象:【第五章 接口】

5.3

接口的成員特點

A:成員變量

隻能是常量

預設修飾符:public static final

B:構造方法

沒有構造方法

C:成員方法

隻能是抽象的

預設修飾符:public abstract

第二階段-Java面向對象:【第五章 接口】

5.4

抽象類和接口的差別(重要)

我們從我們實際設計場景中來切入這個話題

先來舉一個簡單的例子:

狗都具有 eat() 、sleep() 方法,我們分别通過抽象類和接口定義這個抽象概念

//通過抽象類定義
 public abstract class Dog {
      public abstract void eat();
      public abstract void sleep();  
 }           

複制

//通過接口定義
 public interface Dog {
     public abstract void eat();
     public abstract void sleep();
 }           

複制

但是我們現在如果需要讓狗擁有一項特殊的技能——鑽火圈 DrillFireCircle(),如何增加這個行為呢?

思考:

1. 将鑽火圈方法與前面兩個方法一同寫入抽象類中,但是這樣的話,但凡繼承這個抽象類狗都具有了鑽火圈技能,明顯不合适

2. 将鑽火圈方法與前面兩個方法一同寫入接口中,當需要使用鑽火圈功能的時候,就必須實作 接口中的eat() 、sleep() 方法(重寫該接口中所有的方法)顯然也不合适

那麼該如何解決呢 ? 我們可以仔細想一想,eat和sleep都是狗本身所應該具有的一種行為,而鑽火圈這種行為則是後天訓練出來的,隻能算是對狗類的一種附加或者延伸, 兩者不應該在同一個範疇内,是以我們考慮将這個單獨的行為,獨立的設計一個接口,其中包含DrillFireCircle()方法, Dog設計為一個抽象類, 其中又包括eat() 、sleep() 方法.

一個SpecialDog即可繼承Dog類并且實作DrillFireCircle()接口

下面給出代碼:

//定義接口,含有鑽火圈方法
 public interface DrillFireCircle() {
     public abstract void drillFireCircle();
 }
 
 //定義抽象類狗類
 public abstract class Dog {
     public abstract void eat();
     public abstract void sleep();
 }
  
 //繼承抽象類且實作接口
 class SpecialDog extends Dog implements drillFireCircle {
     public void eat() {
 //....
     }
     public void sleep() {
 //....
     }
     public void drillFireCircle() () {
 //....
     }
 }           

複制

總結:

繼承是一個 "是不是"的關系,而 接口 實作則是 "有沒有"的關系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實作則是有沒有、具備不具備的關系,比如狗是否能鑽火圈,能則可以實作這個接口,不能就不實作這個接口。