總網頁瀏覽量

2013年3月3日 星期日

介面interface

介面:
長相與抽象類別相似

宣告方式跟宣告類別很像,有屬性與方法,但是沒有建構式。
無法建立物件。
只是介面宣告以interface
interface Univers{
public static final int age = 120;
abstract void show();
}

//以下是錯誤寫法,interface宣告為public那麼表示檔名要跟interface名稱一樣
//不可加上static,static是修飾method與基本型態變數
//不可加上final,介面是要給類別實作的。
public static final interface career{
int age =20;
abstract void show();

}



特性:
1.有成員變數與方法但是沒有建構式,成員變數必須初始化;方法一律為abstract
2.成員前面一般不加修飾子
3.介面的成員變數預設加上public static final;方法則是加上abstract即抽象方法,介面只有抽象方法,而且只能宣告為public。(抽象類別的method可以宣告public protected default,不可宣告為private)
由此可知介面無法變更成員變數的值,成員變數一定要是定值。無法在介面定義方法的內容。

4.介面無法建立物件
可以宣告介面型態的變數,存取實作介面類別的物件

(抽象類別可以有建構式)



實作(implement):
介面和類別一起使用,稱為實作。類似extends。
class detective implements career{

}
上面程式碼以detective實作carrer介面,如此一來detective類別就繼承carrer介面所擁有的成員變數與方法。


如果要建立detective類別的物件,必須在detective類別中,定義介面中所有的方法,換句話說,就是在detictive類別裡面將career裡面所有的方法,改寫一遍。而成員變數可以在實作類別裡面另行宣告,或者沿用介面的。但是不可更改介面的成員變數的值。



介面解決了java的類別無法多重繼承的問題,
一個類別不可有兩個父類別,如同一個兒子不能有兩個爸爸
但是可以有多個義父、師父。
介面讓類別實現了多重繼承。


以下以神鵰俠侶主角楊過為例子:

interface 歐陽鋒{void 蛤蟆功();}
interface 洪七公{void 打狗棒法();}
interface 郭靖{void 九陰真經();}

class 楊過 implements 洪七公,歐陽鋒,郭靖{

void 打狗棒法(){
.............
}
void 蛤蟆功(){
............
}
void 九陰真經(){......}

}

類別楊過,實作洪七公 歐陽鋒 郭靖三個介面
因此必須改寫override打狗棒法、蛤蟆功、九陰真經。


介面之間可以是繼承的關係。
例如表示成這樣:
interface 郭靖 extends 江南七怪,丘處機
{
.......
}



雖然介面機制類似抽象類別。
介面贏過抽象類別的地方是,抽象類別不可多重繼承。
抽象類別終究還是類別。




也可以用匿名內部類別實作介面的方法

interface Book{
void show();
}

class AnonymouClass{
public static void main(String[] args){
Book book =new Book(){
//----匿名內部類別的內容---
public void show(){System.out.println("ByeBye World");}
};
book.show();
}}


看起來很像new一個Book的物件


我們可以book.getClass().toString得知
book是class interfaceimplement.anonymousclass$1
book是實作匿名類別

沒有留言:

張貼留言