1. 程式人生 > >Java中的抽象類和介面

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("有年終獎");
    }
}