Java中的抽象類和介面
抽象類
當定義一個類時,常常需要定義一些方法來描述該類的行為特徵,但有時這些方法 的實現方式是無法確定的。例如在定義Animal類時,shout方法用於表示動物的 叫聲,但是針對不同的動物,叫聲也是不同的,因此在shout方法中無法準確描述動物 的叫聲。針對上面描述的情況,Java允許在定義方法時不寫方法體,不包含方法體的方法為 抽象方法,抽象方法必須使用abstract關鍵字來修飾。而抽象方法只能存在於抽象類中。
具體示例如下:
abstract class Animal{ } //定義抽象類Animal
abstract void shout (); //定義抽象方法shout()
當一個類中包含了抽象方法,該類必須使用abstract關鍵字來修飾,使用abstrac關鍵字修飾的類為抽象類,具體示例如下:
//定義抽象類 abstract class Animal{ //定義抽象方法 abstract void shut(); } //繼承於Animal的貓類 class Cat extends Animal{ //重寫父類的shut()方法 void shut(){ System.out.println("喵喵......"); } } //繼承於Animal的狗類 class Dog extends Animal { //重寫shut()方法 void shut(){ System.out.println("汪汪......"); } } class RunAnimal{ public static void main(String[] args){ Cat c = new Cat(); Dog d = new Dog(); c.shut(); d.shut(); } } /* 執行結果: 喵喵...... 汪汪...... */
當多個類中出現相同功能,但是功能的主體不同,這時可以進行向上抽取,只抽取功能定義,而不抽取功能主體。
抽象類的特點:
1.抽象方法一定在抽象類中。
2.抽象方法和抽象類都必須用abstract關鍵字修飾。
3.抽象類不能例項化物件,因為呼叫抽象類方法沒有意義。
4.抽象類中的抽象方法要被使用,必須由子類複寫其所有的抽象方法後,建立子類物件呼叫。如果子類只覆蓋了抽象類部分的抽象方法,那麼該子類還是一個抽象類。
介面
介面:可以理解成一個特殊的抽象類。
當抽象類中的方法全是抽象的時候,那麼該抽象類可以通過介面的形式來表示。
class 用於定義類
interface 用於定義介面。 格式:interface Animal{} //定義了、animal介面。
介面定義時,其格式特點:
1.介面中常見定義:常量,抽象方法。
2.介面中的成員都有預設的固定修飾符:
常量:public static final //也就是說你在介面中定義一個常量,編譯時java虛擬機器會自動在常量前面加上這固定的修飾符。
方法:public abstract //方法都是固定的 會被修飾成公有和抽象
介面的特點:
- 介面是對外暴露的規則
- 介面是程式的功能擴充套件
- 介面可以用來多實現
- 類與介面之間是實現關係,而且類可以繼承一個類的同時實現多個介面
- 介面與介面之間也可以有繼承關係
下面有這樣一道題:一個公司有員工和個部門經理 ,編寫一個程式可以描述出每僱員的基本資訊和一些特殊特徵。
思考:經理和員工都屬於公司的僱員,但是經理有年終獎而員工沒有,而且經理和員工都有抽菸的。
我們可以定義兩個介面,分別描述年終獎和抽菸。在定義一個僱員類,員工和經理繼承於僱員類,並可以選擇性的實現抽菸或者年終獎介面。
//定義抽菸介面
interface Smoke{
void smokeing();
}
//定義年終獎介面
interface Bonus{
void bonusing();
}
//定義僱員類
class Employee{
String name ;
String id ;
String branch ;
int age ;
void work(){
System.out.println("僱員和員工都需要工作");
}
}
//抽菸的經理 繼承於僱員,實現抽菸介面和年終獎介面
class JingLi extends Employee implements Smoke,Bonus{
//複寫smoking()抽象方法
void smokeing(){
System.out.println("我抽菸");
}
//複寫bonusing方法
void bonusing(){
System.out.println("有年終獎");
}
}
//抽菸的員工 繼承於僱員,實現抽菸介面
class Smokehand extends Employee implements Smoke{
//複寫smoking()抽象方法
void smokeing(){
System.out.println("我抽菸");
}
}
//不抽菸的經理 繼承於僱員,實現年終獎介面
class JingLi extends Employee implements Bonus{
//複寫bonusing方法
void bonusing(){
System.out.println("有年終獎");
}
}