Java介面詳解

來源:互聯網
上載者:User

對初學者來說,介面不是很好理解。現將某高手的一篇文章貼出來,共大家分享!
我們來看一個類
class A {
private int a;
public int getA() {
return a;
}
}
這個類的屬性是私人的,外界不能訪問,而外界可以通過公有方法來訪問這個類。我們說一個類的公有方
法就是這個類的對外介面。通常
一個類的屬性都是私人的,方法大多是公有的。外界只能過個這些公有方法來訪問類。這也是Java封裝性
的體現。如果一個類沒有公有屬性,
也沒有公有方法,這個類就是無法使用的類了。所以我們需要為一個類提供對外介面。
一個類中的方法,不只是說明了它要“做什麼”,而且方法的內容也說明了“怎麼做”。打個不太恰當的
例子,一個殺人方法。從名字上看,你知道了“做什麼”,但沒有辦法看到“怎麼做”。而方法的內容說
明了“怎麼做”。
class killer {
private String name;
private int age;
private String phone;
private String addr;
......
public void kill(Person p) {
Qiang qiang = new Qiang("ak47");
qiang.fire(p);
}
}
這個類的kill方法內容說明了殺人的過程。如果你不想用這種方式殺人。因為你很BT,你想用毒藥殺人。
那麼這個類的內容就需要改。但是,還有很多其它的“客戶”,需要用不同的方式殺人。怎麼辦呢?一個
很好的辦法就是,我們只定義“做什麼”,而不定義“怎麼做”。
interface Killer {
public void kill(Person p);
}
介面說明了“做什麼”,而實現這個介面的類,也就是實作類別需要說明“怎麼做”。
class Killer1 implements Killer {
public void kill(Person p) {
Qiang qiang = new Qiang("ak47");
qiang.fire(p);
}
}
class Killer2 implements Killer {
public void kill(Person p) {
Bane bane = new Bane();
p.eat(bane);
}
}
public class Test {
public static void main(String[] args) {
Killer jingKe = new Killer1();
Person yingZheng = new Person();
jingKe.kill(yingZheng);
}
}
介面可以把“做什麼”和“怎麼做”分離開來。這給Java帶來了很多好處。雖然代碼量增加了,可我們的
程式的可維護性加強了。我們的程式是可以拆分的。就象電腦一樣,可以拆分成很多組件。我一直在想,
如果我的MP3耳機可以拆分就好了,那樣在耳機只壞掉一個的時候就不用重新買一個了。
不過上面的例子看不到什麼太大的好處。你可能會說,如果你的目的是為了不修改代碼,那麼,如果我想
使用Killer2來完成任務,還是需要修改main方法為:Killer jingKe = new Killer2();。沒有錯,
不過你可以通過一個工廠來完成上面的任務。也就是說,不通過new語句來獲得Killer對象,而是通過工
廠來獲得Killer對象。
public class KillerFactory {
public static killer getKiller() {
return new Killer1();
}
public static Killer getKiller(String path) throws Exception {
Properties prop = new Properties();
prop.load(new FileInputStream(path));
String className = prop.getProperty("killer");
Class clazz = Class.forName(className);
return (Killer)clazz.newInstance();
}
}
代碼確實增加了很多,可是這對後期的系統維修和系統升級帶來了很多好處。
水龍頭與出水管的關係,我們需要把水龍頭安裝到出水管上。如果有一天我們需要更換水龍頭時,只需要
把老的水龍頭拆卸下來,把新的水龍頭安裝到出水管上即可。如果水龍頭與出水管是一體的,就是無法拆
卸的怎麼辦呢?或是說出水管只能安裝水龍頭,而不能安裝淋浴器,這就使我們生活很不方便。我們可以
理解為出水管的串連方法,串連的對象是“出水裝置”,而這個“出水裝置”是一個介面。而水龍頭與淋
浴器都是這個介面的實作類別。但是介面在哪裡呢?它長什麼樣子?我們沒看到。它是一個標準,串連處的
內徑與外徑。螺絲摳的密度等。這就和你的電腦上為什麼可以串連USB裝置一樣。如果電腦和某一個USB設
備電焊到一起,那麼其它的USB裝置就無法使用了。電腦使用的是實現了USB介面的電子裝置,而我們的U
盤、MP3、移動硬碟及滑鼠都是USB介面的實作類別。
用Java寫出來的程式也和我們現實生活中的裝置一樣。如電腦,我們希望電腦的所有組件都可以更換,如
果主板上的記憶體插槽與記憶體條不附。我們說,記憶體條沒有實現某某介面。Java是完全物件導向的,而面向
對象是我們最為熟悉的東東。物件導向並不簡單,而是我們太熟悉它了。所以我們學習Java會很方便。在
現實社會中,所有的標準到了Java中都是介面。一盒香煙多少支煙,煙的長度等都是標準。一個光碟片的大
小。Java中的JDBC就是一個標準,而各大資料庫廠商及第三方廠商實現了這一標準。JDBC只說明了目的,
沒有說明怎麼完成的目的。
物件導向就在我們眼前,不過我們有時不太注意它。希望你在今後學習Java時,多與現實社會聯絡。這樣
可以有利與你的理解。
代碼量加大了,但對後期的維護與升級提供了方便。軟體公司賣給客戶的是class檔案,而不是java檔案
。如果你的客戶需要更換Killer對象,只需修改資源檔既可。
下面我們來看一個定時器類。現在什麼都是自動化的,如空調、電視、洗衣機等等。都要用到定時器這個
類。對了,還有定時炸彈也要用它。那我們可不可以唯寫一個定時器類,應用到所有的需要定時器的裝置
上呢?答案是肯定的,我們需要這個類。
好了,我們來分析一下定時器需要完成什麼工作吧。定時器應該有啟動、停止方法。定時器啟動之後,每
過一定時間就執行某個動作。其中時間間隔為long型,而要執行的動作可能是輸出一個字串,也可能是
列印工作。具體要幹什麼由使用定時器的使用者來完成。而定義定時器時,根本就不知道要幹什麼。
public class Timmer {
private long time;
private Action action;
public Timmer() {}
public Timmer(long time, Action action) {
this.time = time;
this.action = action;
}
public void start() {
state = START;
if(th == null) {
th = new Thread() {
public void run() {
while(state == START) {
try {
Thread.sleep(time);
action.action();
} catch(Exception e) {
}
}
}
};
}
th.start();
}
public void stop() {
state = STOP;
}
public void setTime(long time) {
this.time = time;
}
public void setAction(Action action) {
this.action = action;
}
public long getTime() {
return (this.time);
}
public Action getAction() {
return (this.action);
}
}
Action是一個介面,它只有一個方法,就是要完成的任務。我們在定時器啟動時調用這個介面的方法。而
這個Action介面的對象,代表一個動作,這個動作就是使用者要完成的動作。
public interface Action {
public void action();
}
public static void main(String[] args) {
Timer t = new Timer(2000, new Action() {
public void action() {
System.out.println("Hello World!");
}
});
t.start();
javax.swing.JOptionPane.showMessageDialog(null, "點擊確定按鈕停止定時器");
t.stop();
System.exit(0);
}
這是一個典型的回調方法例子。在AWT中,java使用了大量的監聽器。這些監聽器都是回調方法。在XML解
析器SAX中,也使用了回調方法來解析XML文檔。
介面要比抽象類別還要抽象。抽象類別需要子類繼承,而Java是單繼承,所以抽象類別被限制了。而介面不同,
一個類可以實現多個介面。好比人類與程式員類之間的關係。可以說程式員是人類的子類,如果程式員是
一個介面。用人類的子類來實現它就會更好。這個子類還可以去實現會計介面、音樂家介面等等。
在struts2.0、spring、hibernate等架構中,都大量使用介面。我們關心的是某個介面與另一個介面之間
的關係。而不關心某個實作類別與另一個介面實作類別的關係。在客觀世界中,我們交談時都大量使用介面,
只是我們沒有注意罷了。如:我公司需要一個程式員(一個實現了程式員介面的對象)。上課時,講師有一
台電腦,用白板筆在白板上寫字(電腦是介面,白板及白板筆也是介面)。講師希望學生能學會所有的
知識(講師及學生都是介面)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.