1. 程式人生 > >Java基礎13-抽象類、方法和接口

Java基礎13-抽象類、方法和接口

會有 send 聲明 類的抽象 通過 撲克 重寫 基礎 來看

一、抽象類

1.什麽是抽象類?

讓我們先來看看百度是怎麽解釋的:

抽象類往往用來表征對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

其實,類本身就是一種抽象概念,但它又是具體的事物,所以就被稱為具體類,抽象類似乎就是將本身我們人為劃分的類中有共性的再進一步的進行提取劃分,進一步抽象化,這樣它就不具備實例化對象的特性,它是無法初始化的類

2.為什麽要有抽象類呢?它的意義何在?

我們來看這樣一幅圖。

技術分享圖片

我們可以創建出一個貓的對象,也可以創建出一個狗的對象,但是假如我們創建一個貓科動物的對象或是犬科動物的對象,那我們具體應該創建哪種動物呢?

是要創建貓呢還是獅子呢?是創建狗呢還是創建狼呢?再大一點,如果我們創建動物對象,那完了,這麽多動物,到底是創建那個呢?難不成創建一個雜交物種?

所以,我們從這裏可能會有點感覺到什麽是抽象類和為什麽要有抽象類的概念,因為無論是貓科動物類還是犬科動物類,都是不應該可以創建對象的,它們不應該被初始化。

但是我們一定要有他們來構建樹,來繼承和產生多態,這體現了java的面向對象的思想,那應該怎麽辦呢?

那我們就只要有限制它們,只有它們的子類,具體的類才能創建對象不就可以了嗎,這也是抽象類的目的,防止不應該創建對象的類創建對象

3.抽象類和方法的定義

抽象類和方法用 abstract 關鍵字來定義。

定義格式如下:

抽象類:

abstract class 類名 {

}

抽象方法:public abstract 返回值類型 方法名(參數);

public abstract class Employee {
//abstract關鍵字修飾的抽象類
    private String name;
    private int   number;
    private String job;
    private double salary;
    private double bounes;
//抽象方法,沒有方法體!
    public abstract void work();
    public abstract void welfare();
}

註意:

①抽象方法必須寫在抽象類中,但是抽象類中不一定要寫抽象方法。

②任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類。

③構造方法,類方法(用static修飾的方法)不能聲明為抽象方法。

public abstract class MaintainDepartment extends Employee{
//這是一個Employee的子抽象類
    String CheckIn;
//既可以重寫父類中的抽象方法,寫成實現類
    public void work() {
        System.out.println("維護工作");
    }
    public void welfare() {
        System.out.println("擼貓");
    }
//也可以不重寫抽象方法,由MaintainDepartment的子類去實現這個方法
    public abstract void skill();
}

4.抽象方法的意義和好處

抽象方法的意義在於,我們將可繼承的方法體放在父類中,但父類沒有辦法做出任何子類都有意義的共同程序代碼,這時我們用抽象方法,就算無法實現出方法的內容,還是可以定義出一種子類共同的協議。

抽象方法的好處就是多態。我們可以加入新的子類到程序中,也不必重寫或修改處理這些類型的程序。

二、接口

1.什麽是接口?

接口(英文:Interface),在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。

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

比如說:電腦的電源插頭就是一個接口,它就是為了實現充電的功能,讓我們不必去關心怎麽充電的(電流,電壓...),只要將電源線插入這個接口就可以實現充電的功能能。

2.為什麽要有接口?

先來看一個問題,類只能單繼承,因為多重繼承可能會出現“致命方塊(形狀看起來像撲克牌的方塊)”的問題

技術分享圖片

所以,為了解決多繼承的問題,又不會產生致命方塊的問題,接口就華麗的出現在了我們的舞臺。

接口是怎麽解決這個問題的呢?

它把全部方法都設為了抽象的!這樣子類就必須要實現此方法,因此虛擬機執行時就不會搞不懂用哪個繼承的版本了。

3.接口的定義

接口定義時需要使用interface關鍵字。

註意:定義接口所在的仍為.java文件,雖然聲明時使用的為interface關鍵字的編譯後仍然會產生.class文件。這點可以讓我們將接口看做是一種只包含了功能聲明的特殊類。

public interface 接口名 {

抽象方法1;

抽象方法2;

抽象方法3;

}

public interface HighPoint {
public void autoPark();
public void autoRun();
}

4.類實現接口

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

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

public class NewPhone extends Phone implements IPlay{
    public void Call() {
        System.out.println("鍵盤");
    }
    public void SendMessage() {
        System.out.println("按鍵");
    }
    public void PlayGame() {
        System.out.println("王者榮耀");
    }
}

5.接口和抽象類的異同點

相同點:

  • 都位於繼承的頂端,用於被其他類實現或繼承;
  • 都不能直接實例化對象;
  • 都包含抽象方法,其子類都必須覆寫這些抽象方法;

區別:

  • 抽象類為部分方法提供實現,避免子類重復實現這些方法,提高代碼重用性;接口只能包含抽象方法;
  • 一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個接口;(接口彌補了Java的單繼承)
  • 抽象類是這個事物中應該具備的你內容, 繼承體系是一種 is..a關系
  • 接口是這個事物中的額外內容,繼承體系是一種 like..a關系

二者的選用:

優先選用接口,盡量少用抽象類;

需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;

6.接口的成員特點

  • 接口中可以定義變量,但是變量必須有固定的修飾符修飾,public static final 所以接口中的變量也稱之為常量,其值不能改變。後面我們會講解staticfinal關鍵字
  • 接口中可以定義方法,方法也有固定的修飾符,public abstract
  • 接口不可以創建對象。
  • 子類必須覆蓋掉接口中所有的抽象方法後,子類才可以實例化。否則子類是一個抽象類。

Java基礎13-抽象類、方法和接口