Java如何在代碼體現面向對象(1)-接口、抽象類以及接口抽象類的區別

一、抽象類

(1)什麼是抽象類?

類和類之間有共同特徵,將這些具有共同特徵的類再進一步抽象形成抽象類,由於類本身是不存在的,所以抽象類無法創建對象。

(2)抽象類屬於什麼類型?

抽象類屬於引用數據類型。

(3)抽象類怎麼定義?

	語法:
		[修飾符列表] abstract class 類名{
			類體;
		}

(4)抽象類的子類還可以是抽象類。

(5)抽象類雖然無法實例化,但抽象類還是有構造方法的。

(6)抽象類關聯到抽象方法的概念,什麼是抽象方法呢?

抽象方法是表示沒有實現的方法,沒有方法體的方法。例如:

Public abstract void doSome();

(7)抽象方法特點:

(a)沒有方法體,以分號結尾。

(b)前面修飾符列表中有abstract關鍵字。

(6))抽象類可以沒有抽象方法,但抽象方法一定出現抽象類中。

二、非抽象方法繼承抽象類必須將抽象方法實現(五顆星)

Bird類是繼承了Animal的,而且Animal是一個抽象類,裏面還有抽象方法,如果是Bird繼承了Animal,會把Animal裏面的方法都會繼承過來,但是又由於抽象方法必須在抽象類中,而不能在普通類中,所以必須要把抽象方法進行重寫。

 

結論:一個非抽象的類繼承抽象類,必須要將抽象方法進行覆蓋和重寫。

Animal a = new Bird();//向上轉型。 

這就是面向抽象編程。以後就調用a.xxx,a的類型時Animal,Animal是抽象的,面向抽象編程,不要面向具體編程,降低程序的耦合度,提高程序的擴展力。

問題:Java語言中凡是沒有方法體的方法都是抽象方法?

不對,例如:

public native int hashCode();

這個方法底層調用了C++寫的動態鏈接庫程序。

三、接口

(1)接口也是一種引用數據類型

(2)接口是完成抽象的(抽象類是半抽象),或者接口是特殊的抽象類。

(3)接口怎麼定義:語法是什麼?

[修飾符列表] interface 接口名{
}

(4)接口編譯之後也是.class字節碼文件。

(5)接口支持多繼承

//定義接口
interface A{

}
//定義接口
interface B{

}
//定義接口
interface C extends A,B{
}

(6)接口中只包含兩部分內容:一部分是常量,一部分是抽象方法。

接口當中既然都是抽象方法,那麼在編寫代碼的時候,public  abstract可以省略嗎?

可以的,因爲所有的方法都是Public abstract修飾的。

(7)接口中所有的元素都是public修飾的。

(8)

interface MyMath{
//常量
public static final double pI = 3.141592653589793 ;
		
}

這裏的public static final可以省略嗎?

可以的

double PI =3.14

所以在外面不能修改PI的值。

(9)類和類直接叫繼承,類和接口之間叫做實現。

這裏的實現可以看做“繼承”

繼承使用extends關鍵字完成

實現使用implements關鍵字完成。

(10)(特別重要)當一個非抽象的類實現接口的話,必須將接口中所有的抽象方法全部實現。(覆蓋,重寫)

(11)如果一個類實現了接口,裏面的方法需要全部的實現,並且方法修飾符只能更高,不能更低,更不能不寫。

(12)接口和接口之間支持多繼承,那麼一個類可以同時實現多個接口嗎?

//定義接口
interface A{
    void m1();
}
//定義接口
interface B{
    void m2();
}
//定義接口
interface C {
    void m3();
}

class D implements A,B,C{

    //實現A接口的m1()
    public void m1(){
    }
    //實現B接口中的m2()
    public void m2(){
    }
    //實現C接口中的m3()
    public void m3(){
    }
}

重點:一個類可以同時實現多個接口,彌補了java中只支持單繼承。

四、implements和extends同時出現

(1)繼承和實現都存在的話,代碼怎麼寫?

Extends 關鍵字在前,implements 關鍵字在後

class Animal{
}

interface Flyable{
    void fly();
}

class Cat extends Animal implements Flyable{
    public void fly(){
    System.out.println("飛貓");
    }
}
public class Test{
    public static void main(String [] args){
        //創建對象
       Flyable  f = new new Cat();//多態
        f.fly();
    }
}

五、接口在開發中的作用

(1)接口在開發中的作用類似於多態在開發中的作用。

多態:面向抽象編程,不要面向具體編程,降低程序的耦合度,提高程序的擴展力。

(2)接口是不是完全抽象的?是

而我們以後正好要求,面向抽象編程,面向抽象編程這句話以後可以改爲面向接口編程。有了接口就有了可插拔,表示擴展能力強,不是焊接了。

接口可以解耦合,解開的是誰和誰的耦合

任何一個接口都有調用者和實現者。

接口可以將調用者和實現這解耦合。

調用者面向接口調用。

實現者面向接口編寫實現。

下面用代碼體現:

publicclassTest{
publicstaticvoidmain(String[]args){
//實例化廚師
ChinaCookeryinpin=newChinaCooker();
JanpanCookerjunshui=newJanpanCooker();
//實例化顧客
Customerxiaowei=newCustomer(yinpin);
//顧客想吃中國菜

xiaowei.order();
}
}
//菜單接口
interfaceMenu{
voidCaihua();
voidChicken();
}
//顧客
classCustomer{
MenuM;

publicCustomer(){
}

publicCustomer(Menum){
M=m;
}
publicvoidorder(){
M.Caihua();
M.Chicken();
}

}
//中國廚師
classChinaCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("中國廚師做的菜花");
}

@Override
publicvoidChicken(){
System.out.println("中國廚師做的雞塊");
}
}
//日本廚師
classJanpanCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("日本廚師做的菜花");
}

@Override
publicvoidChicken(){
System.out.println("日本廚師做的雞塊");
}
}

六、接口和抽象類的區別

(1)定義語法上不同

(2)抽象類是半抽象,而接口是完全抽象的,抽象類裏面有構造方法,而接口中只能有常量和抽象方法。

(3)抽象列不支持多繼承,而接口支持多繼承。

(4)接口中所有的元素都是public修飾的,抽象方法是public abstract修飾的,常量是public static final修飾的。

(5)接口和抽象類都能實現多態(父類型的引用指向子類型的對象)

總結:以前總感覺抽象類和接口都差不多,但是發現他們之間的區別還是挺大的,接口屬於完全抽象,抽象類屬於半抽象,所以這也導致了以後在開發中接口運用的會比抽象類要多的多,而且我感覺更有意思的是接口裏面的常量居然是可以省略了public static final的方法是省略了public abstract的,這要是不知道,以後可能會把接口中的常量認爲是變量,把方法認爲是普通方法了吧。

 

Java如何在代碼體現面向對象和多態(2)-is a(繼承)、has a (關聯)、like a(實現)(什麼時候在類中定義另一個類?)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章