Java語(yǔ)言提供了一種接口(interface)機(jī)制。這種接口機(jī)制使Java的面向?qū)ο缶幊套兊酶屿`活。我們可以用接口來(lái)定義一個(gè)類(lèi)的表現(xiàn)形式,但接口不能包含任何實(shí)現(xiàn)。在《Thinking in Java》一書(shū)中,作者對(duì)接口有這樣的描述:“接口(interface)比抽象(abstract)的概念更進(jìn)了一步。你可以把一個(gè)接口看成是一個(gè)純的抽象類(lèi)。”我認(rèn)為作者對(duì)接口的這一解釋再準(zhǔn)確不過(guò)了。 理解并用好接口機(jī)制將幫助我們更好的掌握J(rèn)ava這種面向?qū)ο蟮木幊陶Z(yǔ)言。下面我們來(lái)討論一下接口的使用規(guī)則以及相關(guān)的應(yīng)用。 一、接口的定義及實(shí)現(xiàn) 定義接口和定義類(lèi)相似,只是要把 class關(guān)鍵字換為 interface。定義方法時(shí)只需要方法名,返回類(lèi)型和參數(shù)列表,不能有方法體。接口中可以定義字段,這些字段都被暗指為 static 和 final,因此應(yīng)該根據(jù)需要先定好這些字段的值。例如: public interface Flyable { void fly(); } public interface Talkable { void talk(); } public interface Message { int MAX_SIZE = 4096; String getMessage(); } 上面定義的幾個(gè)接口中,F(xiàn)lyable 和 Talkable 只定義了一個(gè)方法,而 Message 里除了方法外還有一個(gè)字段 MAX_SIZE。可以看出這些接口只定義了類(lèi)的表現(xiàn)形式,而不包含任何實(shí)現(xiàn),所以不能直接使用。要使用這些接口就需要有相應(yīng)的類(lèi)去實(shí)現(xiàn)它們。實(shí)現(xiàn)接口時(shí)應(yīng)該先在類(lèi)名后用 implements 關(guān)鍵字申明將要實(shí)現(xiàn)的接口,如果要實(shí)現(xiàn)多個(gè)接口,應(yīng)該用逗號(hào)將它們隔開(kāi),然后一一實(shí)現(xiàn)這些接口中定義的方法。如下面的例子: public class Parrot implements Flyable, Talkable { public void fly() { System.out.println("Flying like a parrot…"); } public void talk() { System.out.println("Hello! I am a parrot!"); } } public class TextMessage implements Message { String message; public void setMessage(String msg) { message = msg; if (message.length() > MAX_SIZE) message = message.substring(0, MAX_SIZE); } public String getMessage() { return message; } } 在 Parrot(鸚鵡)例子中,我們用接口 Flyable 來(lái)表示飛行能力,Talkable 表示說(shuō)話能力,但它們并不包含具體實(shí)現(xiàn)。而 Parrot 同時(shí)具有這兩種能力,所以我們?yōu)?Parrot 類(lèi)同時(shí)實(shí)現(xiàn)了 Flyable 和 Talkable 這兩個(gè)接口。同樣我們還可以定義一個(gè)Swallow(燕子)類(lèi),但燕子只有飛行能力,所以我們只需要為 Swallow 實(shí)現(xiàn) Flyable 就行了。因?yàn)樗鼈兏髯缘牡娘w行方法有所不同,所以它們有各自關(guān)于飛行的具體實(shí)現(xiàn)。 另外,正因?yàn)橐粋€(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口,使得Java的面向?qū)ο筇匦宰兊梅浅l`活。運(yùn)用這種特性,我們可以實(shí)現(xiàn)類(lèi)似C++語(yǔ)言中多繼承那樣的特性,甚至更靈活的一些特性。下面我們來(lái)討論一下接口在實(shí)際中的應(yīng)用。 二、用接口來(lái)定義一些全局變量 因?yàn)榻涌趦?nèi)的字段都是static和final的,所以我們可以很方便的利用這一點(diǎn)來(lái)創(chuàng)建一些常量。例如: public interface Constants { String ROOT = "/root"; int MAX_COUNT = 200; int MIN_COUNT = 100; } 在使用時(shí)可以直接用Constants.ROOT這樣的形式來(lái)引用其中的常量。我們還可以用下面這種方法來(lái)創(chuàng)建初始值不確定的常量。 public interface RandomColor { int red = Math.random() * 255; int green = Math.random() * 255; int blue = Math.random() * 255; } 其中red、green和blue的值會(huì)在第一次被訪問(wèn)時(shí)建立,然后保持不變。 三、用接口來(lái)定義基本數(shù)據(jù)結(jié)構(gòu) |
評(píng)論
# re: Java程序設(shè)計(jì)中的接口應(yīng)用 回復(fù) 更多評(píng)論
2007-06-16 14:39 by itkui哎,接口就是理解不透。。。
# re: Java程序設(shè)計(jì)中的接口應(yīng)用 回復(fù) 更多評(píng)論
2007-06-16 18:14 by 停留的風(fēng)@itkui
那就簡(jiǎn)單的理解哦,interface 其實(shí)也是class,只是里面的方法都是抽象的,可以說(shuō)是多種事務(wù)將其共同點(diǎn)抽象出來(lái),定義一個(gè)方法,那么就可以組成一個(gè)抽象類(lèi)哦。完全抽象的類(lèi)就是interface。
那就簡(jiǎn)單的理解哦,interface 其實(shí)也是class,只是里面的方法都是抽象的,可以說(shuō)是多種事務(wù)將其共同點(diǎn)抽象出來(lái),定義一個(gè)方法,那么就可以組成一個(gè)抽象類(lèi)哦。完全抽象的類(lèi)就是interface。
# re: Java程序設(shè)計(jì)中的接口應(yīng)用 回復(fù) 更多評(píng)論
2007-08-01 09:36 by ltw為什么有的事件要實(shí)現(xiàn)接口,而有的不用實(shí)現(xiàn)呢(Buttn的actionPerformed)
# re: Java程序設(shè)計(jì)中的接口應(yīng)用 回復(fù) 更多評(píng)論
2007-08-04 20:39 by you@ltw
這就看你實(shí)現(xiàn)什么功能啦,如果父類(lèi)有這些接口我們可以實(shí)現(xiàn)它。如果你實(shí)現(xiàn)了接口,里面的所有方法都要實(shí)現(xiàn)
這就看你實(shí)現(xiàn)什么功能啦,如果父類(lèi)有這些接口我們可以實(shí)現(xiàn)它。如果你實(shí)現(xiàn)了接口,里面的所有方法都要實(shí)現(xiàn)
只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||