標籤:
/*
介面:初步理解,可以認為是抽象類別,當所有方法都是抽象方法時,的另一種表示方式。
介面的定義格式和類差不多,介面的名字也需要大寫。
Interface 介面名
{
....//介面定義。
}
介面中的一般內容有:常量、抽象方法
介面中的成員都是由固定的修飾符修飾的。
常量:public static final (全域常量,用類名引用)
抽象方法:public abstract
介面中在定義成員時,可以不帶修飾符,因為介面中的成員修飾符都是固定的,少什麼修飾符,系統就會預設添加
什麼修飾符。即成員修飾符可以省略,但是在實際開發中,最好全部都帶著,這樣程式的閱讀性會更好。
介面中的實現的含義,對於成員方法而言,就是覆蓋(覆寫)。
介面和抽象類別的不同:
介面中的方法都必須是公用的,且抽象的
抽象類別中的方法的許可權可以使自己設定,且可以是抽象的,也可以不是抽象的。
介面中的成員變數都是常量,且都是全域常量,用類名就可以訪問
抽象類別中的成員變數許可權,靜態與否,是否是常量可以由自己來定義。
介面與類之間的關係是實現:用關鍵字implements表示。
用實現而不用繼承,就是要和抽象類別做出區分,子類繼承父類,是說明父類中的某些方法可以直接拿過來使用
不必去覆蓋(覆寫 <=> 實現)。而對於子類實現介面而言,需要將介面中的所有方法全部都實現。所以就用
實現以示區分。本質上實現一個介面相當於對於全部方法都是抽象方法的抽象類別的繼承。子類擁有介面的所有
內容,並且對於介面中定義的抽象方法要全部實現,才能建立子類的執行個體(對象),若只實行實現(覆蓋、覆寫
)介面中的部分內容,則子類必須定義成抽象類別,因為子類實現了介面,其內有了一部分抽象方法。
介面被編譯後也會形成.class檔案,.class檔案名稱和介面名一致。即介面是以類的形式體現的。
介面從某種意義上可以看成抽象類別,而實現相當於繼承。
介面和介面之間存在多繼承。
介面和介面之間可以有多繼承的,原因是介面中的方法都是抽象方法,只有方法聲明,沒有方法體,所以
當介面C繼承介面A,介面B時,A,B中即時有一模一樣的方法存在,也只相當於在C中存在一個即可。類D實現
介面C的時候,只需要在類定義中覆蓋(覆寫、實現)一次,就可以覆蓋(覆寫、實現)A,B中的兩個方法。
但是也不允許出現這樣的情況:
即介面A,介面B中存在兩個函數名稱,參數列表完全一樣,但是傳回值不一樣的函數。
因為覆蓋(覆寫、實現)的特性要求,覆蓋函數和被覆蓋函數必須是一模一樣(包括傳回值、函數名、參數列表)
,覆蓋函數的許可權大於等於被覆蓋函數的許可權。
所以當類D實現介面C時,在類D的定義中就需要存在兩個函數名,參數列表一模一樣的函數,但是這樣就會出錯。
所以這種情況也是不允許出現的,否則編譯器報錯。
介面可以被類多實現,即一個類A可以實現多個介面(介面B,介面C,介面D...)。
一個類可以實現多個介面的原因:類C可以同時實現介面A,介面B。因為即使A,B中存在一模一樣的方法,也只需要在
類C的定義中覆蓋一次就可以了。類C的對象在調用的時候並不會出現問題。歸根結底就是A,B中沒有方法體,只有
方法定義。類C可以隨便實現(覆蓋、覆寫)。
當然也允許出現下面的情況:
即介面A、B中出現除了傳回值類型外其他都一模一樣的方法。因為這樣的話類C中就會有兩個除了傳回值不同外,
其他都相同的兩個一模一樣的方法了。這是不允許的,JAVA編譯器會報錯。
java中類和類之間只能有單繼承(可以有多層繼承),但是不能有多繼承。
原因是:當子類C繼承父類A,父類B時,若
父類A和父類B中存在著一模一樣的方法,或者方法名和參數列表相同,傳回值不同的方法時,則子類C的對象在調用時
,會出現問題。所以Java中不允許有多繼承。
介面的多實現(即一個類可以實現多個介面)是類之間的多繼承在JAVA中的體現。JAVA用類的多實現來代替類與類的多
多繼承。
介面用來增加類的功能。一個類可以在繼承另一個類的同時實現多個介面。
*/
interface Inter
{
public static final int NUM = 4;
public abstract void show();
}
class Test implements Inter
{
public void show()
{
}
//public void speak();函數括弧()後面,要麼是;要麼是{},當是;時,必須聲明為抽象函數。
//一個類中的一個方法,要麼有方法體,要麼是抽象。不允許存在沒有方法體的非抽象函數。
// 在任意{}後面跟著;也是正確的寫法,但一般都省略。
}
interface A
{
public abstract void methodA();
}
interface B//extends A
{
public abstract void methodB();
}
interface Cextends B,A
{
public abstract void methodC();
}
class D implements C
{
public void methodA(){}
public void methodB(){}
public void methodC(){}
}
interface InterA
{
public abstract void show();
}
interface InterB
{
public abstract void show();
}
interface InterC extends InterA,InterB
{
public abstract void speak();
}
class TestD implements InterC
{
public void show(){}
public void speak(){}
}
/*
錯誤樣本:
interface A
{
public abstract int show();
}
interface B
{
public abstract boolean show();
}
class C implements A,B
{
public int show(){}
public boolean show(){}
}
class D
{
public static void main(String[] args)
{
C c = new C();
}
}
*/
class InterfaceDemo
{
public static void main(String[] args)
{
Test t = new Test();
System.out.println(t.NUM);
}
}
java介面理解