摘要:內部類是定義在一個類內,它有靜態內部類與非靜態內部類兩種。內部類可以訪問外部類的成員,但外部類不能直接訪問內部類的成員。由內部類可以引申出匿名內部類,匿名內部類在處理事件時是非常方便的。
關鍵詞:內部類;內部匿名類;外部類
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)29-0400-02
Analysis of the Internal Category and Anonymous Category in the Java Language
WU Jin-xiu
(Huanggang Polytechnic College,Huanggang 438002,China)
Abstract: Internal category is defined in a category. It can be classified as static category and non-static category. Internal class can access the external members, but external class can't access the internal members directly. The anonymous internal class can be extended from the internal one, and it is very convenient to deal with all events.
Key words: internal category; anonymous internal category; external category
1 引言
內部類是指把一個類定義在另一個類的類體中。里面的類被稱為內部類。內部類作為外部類的一個成員而存在的。內部類可用靜態修飾,也可用protected和 private修飾。通過內部類可以繼承某個類或實現某個接口,以減少程序代碼和增強程序可讀性;內部類都能獨立地實現接口,如果外部類實現了某接口,這時的內部類相當于實現了“多重繼承”。Java語言中只支持“單重繼承”,利用接口解決了多重繼承的問題,而內部類也有效地實現了“多重繼承”。
2 內部類
內部類有靜態內部類和非靜態內部類之分。
2.1 非靜態內部類
非靜態內部類可以直接使用外部類的成員,可用public/private/default權限修飾符,但不能定義靜態成員。例:
publicclassOuter {
inti = 10;
static intj = 20;
publicvoidouter_f1() {}
publicstaticvoidouter_f2() {}
class Inner {
voidinner_f1() {
inti = 30;
System.out.println(Outer.this.i);
System.out.println(j);
outer_f1();
outer_f2(); }}
1) 在內部類中,訪問外部類的成員
在內部類Inner中,可以直接訪問外部類Outer的成員。
①直接訪問外部類的成員變量。如在方法inner_f1()中:System.out.println(j); System.out.println(i);
②直接訪問外部類的成員。如在Inner類中:outer_f1(); outer_f2();
③ 如果內部類中出現了與外部類同名的變量,則對于外部類同名的變量的訪問形式為:外部類名.this.變量名,如方法inner_f1()中訪問外部類的變量i:System.out.println(Outer.this.i);
2) 在外部類中,訪問內部類中的成員
①外部類的非靜態方法訪問內部類,可以直接通過內部類的對象進行訪問,如在Outer類中訪問Inner類的方法inner_f1:
publicvoidouter_f3() {
Inner inner = new Inner();
inner.inner_f1(); }
②外部類的靜態方法訪問成員內部類,可以通過內部類的對象進行訪問,但創建內部類的對象必須通過外部類的對象來創建,如在Outer類中訪問Inner類的方法inner_f2:
publicstaticvoidouter_f4() {
Outer out = new Outer();
Inner inner = out.new Inner();
inner.inner_f1();}
注意:內部類是一個編譯時的概念,一旦編譯成功生成兩個類。outer.class和outer$inner.class兩類。
2.2 靜態內部類(嵌套類)
非靜態內部類的對象隱含地保存了一個引用指向創建它的外部類對象。當不需要內部類對象與其外部類對象之間有聯系,將內部類聲明為static,通常稱為嵌套類。靜態內部類可以用public,protected,private修飾,靜態內部類中可以定義靜態或者非靜態的成員。與非靜態內部類的區別在于要創建靜態內部類的對象,不需要通過其外部類的對象來創建;靜態內部類的對象不能訪問外部類的非靜態成員。
publicclass Outer {
staticinti = 10;
inj = 20;
publicstaticvoidouter_f1() { }
publicvoidouter_f2 ( ) { }
static classInner {
staticintinner_i = 30;
intinner_j = 40;
static void inner_f1() {
System.out.println(\"Outer.i\" + i);
outer_f1(); }
void inner_f2() {}}
publicvoidouter_f3() {
System.out.println(Inner.inner_i);
Inner.inner_f1();
Inner inner = new Inner();
inner.inner_f2(); }}
2.2.1 靜態內部類中訪問外部類的成員
1) 靜態內部類只能訪問外部類的靜態成員
如在inner_f1()中訪問了外部類的靜態成員變量i和靜態成員方法outer_f1()。
2) 靜態內部類不能訪問外部類的非靜態成員
如在inner_f1()中不能訪問了外部類的靜態成員變量i和靜態成員方法outer_f1()。
2.2.2 外部類訪問內部類的成員
1) 外部類訪問內部類的靜態成員
外部類訪問內部類的靜態成員的形式為:內部類.靜態成員,如方法outer_f3()中Inner.inner_i。
2) 外部類訪問內部類的非靜態成員
外部類訪問內部類的非靜態成員通過內部類的對象進行。如:方法outer_f3()中Inner inner = new Inner();inner.inner_f2();先創建內部類的對象inner,然后通過inner來訪問innner_f2()。
2.2.3 靜態內部類的對象
可以直接創建:Outer.Inner in = new Outer.Inner(); 而不需要通過生成外部類對象來生成。實際上靜態內部類成為了一個頂級類(是一個包含內部類而它自己并沒有被嵌套到其他類中的類)。
3 匿名內部類
沒有類名的內部類就是匿名類。通常用一條語句完成匿名類的定義與實例創建。
3.1 什么時候使用匿名類
類定義代碼段很短;只需要創建該類的一個實例;類的定義代碼與類的使用代碼緊鄰。使用匿名內部類是應注意:匿名內部類不能有構造方法;不能定義任何靜態成員、方法和類;不能是public,protected,private,static。
3.2 匿名內部類
一個匿名內部類一定是在new的后面,用其隱含實現一個接口或繼承一個類。
下面的例子完成窗口的關閉功能,由內部類改為匿名類來實現:
例1:用內部類窗口的關閉事件。
import java.awt.*;
import java.awt.event.*;
public class TestWindowClose extends Frame
{ public TestWindowClose()
{super();
addWindowListener(new WindowClose());
setSize(200,100);
setVisible(true);}
class WindowClose extends WindowAdapter
{public void windowClosing(WindowEvent e)
{ dispose();System.exit(0);}
}
public static void main(String[] args)
{TestWindowClose t=new TestWindowClose(); }
}
例2:改用匿名內部類來實現窗口的關閉事件,代碼如下。
import java.awt.*;import java.awt.event.*;
public class TestWindowClose extends Frame
{ public TestWindowClose()
{super();
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{ dispose(); System.exit(0); }} );
setSize(200,100);setVisible(true);}
public static void main(String[] args)
{TestWindowClose t=new TestWindowClose();}
}
4 結束語
內部匿名類可提高程序的可讀性,減少程序代碼,使程序結構緊湊。
參考文獻:
[1] Java內部類總結[EB/OL].http://www.chinabeta.cn.
[2] 朱喜福.Java程序設計[M].北京:清華大學出版社,2004.