JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » Object/物件導向  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 給新手 - 介面(interface) [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2003-09-13 01:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這篇文章老實說我覺得寫得不是很好,因為寫得很零碎,且當中涉及一些觀念性的問題,再加上我對於介面的使用時機一直不是能很精確的掌握!

因為另一個討論串討論到多型,我想,還是將它貼過來接受批評,以釐清我的一些觀念,這篇可以與另一些「給新手 - 抽象類別、抽象函式」共同來看,畢竟抽象類別(abstract class)與介面(interface)新手容易搞混,老手也不見得一定能體會。

==========================================================================

interface可以讓我們建立完全抽象的介面,介面的宣告是使用interface關鍵字,宣告方式如下:
1
2
3
4
5
[public] interface 介面名稱 {
    權限限定 傳回型態 方法(參數列);
    權限限定 傳回型態 方法(參數列);
    // ....
}


一個宣告interface的例子如下所示:
1
2
3
interface ServerListener {
    public void listen();
}


當我們宣告類別時,我們可以使用implements關鍵字來一併指定要實作哪個介面,介面中所有定義的方法都要實作,例如:
1
2
3
4
5
6
7
8
9
10
11
12
class BigServer implements ServerListener {
    private String name;
                                                                                
    public BigServer(String name) {
        this.name = name;
    }
                                                                                
    // 實作介面方法
    public void listen() {
        System.out.println("Now, BigServer " + name + " is listening....");
    }
}


下面這個程式示範一些interface的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface ServerListener {
    public void listen();
}
 
class BigServer implements ServerListener {
    private String name;
 
    public BigServer(String name) {
        this.name = name;
    }
 
    // 實作介面方法
    public void listen() {
        System.out.println("Now, BigServer " + name + " is listening....");
    }
}
 
class TinyServer implements ServerListener {
    private String name;
                                                                                
    public TinyServer(String name) {
        this.name = name;
    }
                   
    // 實作介面方法                                                             
    public void listen() {
        System.out.println("Now, TinyServer " + name + " is listening....");
    }
}
 
public class UseInterface {
    public static void main(String[] args) {
        BigServer bigServer = new BigServer("Big Brother");
        TinyServer tinyServer = new TinyServer("Small Boy");
 
        bigServer.listen();
        tinyServer.listen();
    }
}


執行結果:
1
2
3
$ java UseInterface
Now, BigServer Big Brother is listening....
Now, TinyServer Small Boy is listening....


在C++中可以使用多重繼承,但在Java中只能單一繼承,也就是一次只能繼承一個類別,Java使用interface來達到某些多重繼承的目的,您可以一次實作多個介面,就像是同時繼承多個抽象類別,實作多個介面的方式如下:
1
2
3
class 類別名稱 implements 介面1, 介面2, 介面3 {
    // 介面實作
}


當您實作多個介面時,記得實作每一個介面中所定義的方法。

介面還可以用來定義介面常數,其作用有些類似C++後的列舉功能,一個實例如下所示:
1
2
3
4
5
interface OperateConstants {
       public static final TurnLeft = 1;
       public static final TurnRight = 2;
       public static final Shot = 3;
}


宣告以上的類別之後,我們就可以在程式中直接使用OperateConstants.TurnLeft之類的名稱來取代常數值,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void doOp(int op) {
    switch(op) {
        case OperateConstants.TurnLeft:
            System.out.println("向左轉");
            break;
        case OperateConstants.TurnRight:
            System.out.println("向右轉");
            break;
        case OperateConstants.Shoot:
            System.out.println("射擊");
            break;
    }
}


介面其實與抽象類別的作用類似,但有一些地方不同,例如抽象類別中允許您先實作某些方法,但介面定義中是完全不實作,它只定義方法名稱,介面常用於規範統一的操作介面,像在視窗程式中,就使用介面來實作指定的事件處理傾聽者。

抽象類別類似於抽象資料型態,它定義任何的子類別或子型態所共同擁有的特性,而介面則定義一組協定,所有實作它的類別都必須遵守的協定,介面可以保證實作它的類別一定會實作所定義的方法。

介面也可以用於宣告型態變數,實作介面的物件可以指定給該變數,一個例子如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface ServerListener {
    public void listen();
}
 
class BigServer implements ServerListener {
    private String name;
 
    public BigServer(String name) {
        this.name = name;
    }
 
    // 實作介面方法
    public void listen() {
        System.out.println("Now, BigServer " + name + " is listening....");
    }
}
 
class TinyServer implements ServerListener {
    private String name;
                                                                                
    public TinyServer(String name) {
        this.name = name;
    }
                   
    // 實作介面方法                                                             
    public void listen() {
        System.out.println("Now, TinyServer " + name + " is listening....");
    }
}
 
public class UseInterface {
    public static void main(String[] args) {
        ServerListener serverListener = new BigServer("Big Brother");
        serverListener.listen();
 
        serverListener = new TinyServer("Small Boy");
        serverListener.listen();
    }
}


執行結果:
1
2
3
$ java UseInterface
Now, BigServer Big Brother is listening....
Now, TinyServer Small Boy is listening....


就如這個程式所示的,我們可以使用interface來統一呼叫的介面,這也是實現多型的一種方式。

介面也可以進行繼承的動作,同樣也是使用extends關鍵字,例如:
1
2
3
interface 名稱 extends 介面1, 介面2 {
    // ...
}


不同於類別的是,介面可以同時繼承多個介面,這也可以達到多重繼承的功能,而實作子介面的類別必須將所有在父介面和子介面中所定義的方法實做出來。


caterpillar edited on 2005-08-21 19:21
reply to postreply to post
良葛格學習筆記
話題樹型展開
人氣 標題 作者 字數 發文時間
31452 [精華] 給新手 - 介面(interface) caterpillar 4790 2003-09-13 01:48
28129 Re:給新手 - 介面(interface) Duncan 1919 2003-09-13 01:59
28433 Re:給新手 - 介面(interface) zrjian 881 2003-10-22 09:44
27526 Re:給新手 - 介面(interface) caterpillar 221 2003-10-22 15:54
27446 Re:給新手 - 介面(interface) caterpillar 225 2003-10-24 14:28
27660 Re:給新手 - 介面(interface) Duncan 195 2003-10-24 16:14
27568 Re:給新手 - 介面(interface) TAHO 1098 2004-01-07 04:13
19979 Re:給新手 - 介面(interface) slin_2008 25 2006-02-08 17:13
20004 Re:給新手 - 介面(interface) kentsl 32 2006-02-09 11:20
20868 Re:給新手 - 介面(interface) cozybreeze 360 2006-03-08 10:14
15106 Re:給新手 - 介面(interface) 瑤瑤 58 2007-01-14 11:17
» JWorld@TW »  Java 新手區 » Object/物件導向

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8