Java的內層類和外層類(轉)

BSDLite發表於2007-08-15
Java的內層類和外層類(轉)[@more@]什麼是inner class?
內層類就是在另一個類的內部定義的一個類,定義這個類的類被稱作外層類.內層類最大的優點在於它擁有對在外層類中定義的所有變數和方法的訪問權.這也是內層類非常適合於建立介面卡的原因;內層類的另一個優點是使用者可以看到它們例項化一個介面的例項,如下程式碼(這
是按鈕單擊事件的程式碼):
//outer class is "Frame1"
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
button1_actionPerformed(e); //button1_actionPerformed(e)方法定義在Fr
ame1中
}
});
其中:
java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
button1_actionPerformed(e);
}
}
這就是定義的一個內層類!事實上ActionListener是一個介面,其後的{}中的內容是這個內層類的唯一的一個方法:public void actionPerformed(ActionEvent e);這個內層類沒有任何屬性.這個方法中的唯一動作就是呼叫了按鈕單擊的方法----button1_actionPerformed
(e)
----這個方法在外層類Frame1中定義:我們的處理就在這個方法中,比如我們可以寫:
void button1_actionPerformed(ActionEvent e){
System.exit(0);
}
在這裡,我們看到了內層類在呼叫外層類的方法----button1_actionPerformed(e).同時,我們注意到該內層類定義的前面的"new",她把這個內層類例項化了!
匿名類和命名類
在上面這段程式碼中,定義的內層類沒有類名,這是因為這個類只被使用了一次,是一個"一次性"類,即匿名類.不用擔心這個類的名字,Java會在背後幫我們做這些.在編譯之後,可以在專案目錄下找到這些類,它們具有這樣的名字:Frame1$1.class,Frame1$2.class等等,以此類推.我們也可以使用這項技術如:
Button newButton = new Button(){
public void someNewMethod(){
/* Defination of extra method here */
}
};
這裡,newButton物件是正常的java.awt.Button,其中含有為它定義的一個額外方法.當想在一個內層類內建立多個物件時,要使用命名類,而不要使用匿名類.實際上命名類在本質上和匿名類沒有什麼不同,其程式碼如下:
public Frame1 extends DecoratedFrame{
...
public Frame1(){
...
try{
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
} //end of Frame1 constructure
private void jbInit() throws Exception{
...
button1.addActionListener(new Button1Adapter());
...
} //end of jbInit() method
class Button1Adapter implements java.awt.event.ActionListener{
public void actionPerformed(ActionEvent e){
button1.actionPerformed(e);
}
}
void button1_actionPerformed(ActionEvent e){
/* Your own statements */
}
}
這裡,為名為Button1Adapter的一個類提供了正常的定義.這個類實現ActionListener介面.
new建立介面卡的一個例項,可以將其餘button1物件註冊到一起.內層類將會擁有這樣的檔名:Frame1$Button1Adapter.class.
上面的程式碼也可以不用內層類來實現.但標準的方法是應該使用內層類.各位如果感興趣的話,也可以試試不用內層類來實現上述程式碼...

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959862/,如需轉載,請註明出處,否則將追究法律責任。

相關文章