定義在一個類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內(nèi)部類或外部類繼承與擴展,或者聲明為static、final的,也可以實現(xiàn)特定的接口。static的內(nèi)部類行為上象一個獨立的類,非static在行為上類似類的屬性或方法且禁止聲明static的方法。內(nèi)部類可以訪問外部類的所有方法與屬性,但static的內(nèi)部類只能訪問外部類的靜態(tài)屬性與方法。
外部類按常規(guī)的類訪問方式使用內(nèi)部類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。如:
pinner p = new pinner();
p.index = 20;
p.Print();
---- 這種方式適合外部類的非static方法;
pouter po = new pouter();
pinner pi = po.new pinner();
pi.index = 40;
pi.Print();
---- 這種方式適合外部類的static方法;
內(nèi)部類類似外部類的屬性,因此訪問內(nèi)部類對象時總是需要一個創(chuàng)建好的外部類對象。內(nèi)部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:
System.out.println("Print in inner Outer.index=" + pouter.this.index);
System.out.println("Print in inner Inner.index=" + this.index);
如果需要在其他類中訪問內(nèi)部類,可以使用:
(1)外部類提供創(chuàng)建內(nèi)部類的方法供其他類使用。如:
// 外部類
pinner getInner()
{
return new pinner();
}
// 其他類
pouter.pinner pi = po.getInner();
pi.Print();
(2)直接創(chuàng)建內(nèi)部類的對象。如:
pouter po = new pouter();
pouter.pinner pi = po.new pinner();
pi.Print();
內(nèi)部類可以聲明在外部類的方法中或語句塊中。如果內(nèi)部類需要訪問包含它的外部類方法或語句塊的局部變量或參數(shù),則該局部變量或參數(shù)必須是final的。外部類的其他方法、其他類無法訪問聲明在方法內(nèi)部或塊內(nèi)部的內(nèi)部類。
如果一個類繼承內(nèi)部類,則創(chuàng)建該類的對象時需提供一個外部類的對象作為構(gòu)造方法的參數(shù)。如:
class Car
{
class Wheel
{
}
}
class SuperWheel extends Car.Wheel
{
SuperWheel(Car car)
{
car.super();
}
public static void main(String [] args)
{
Car car = new Car();
SuperWheel wl = new SuperWheel(car);
}
}
如果創(chuàng)建命名的內(nèi)部類沒有多少實際意義時,可以創(chuàng)建匿名的內(nèi)部類。比如使用內(nèi)部類實現(xiàn)接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據(jù)實際的情況創(chuàng)建相應(yīng)的內(nèi)部類時,可以使用匿名內(nèi)部類。簡單的示例如下:
interface WebView
{
void doGet();
}
class A
{
WebView ShowName()
{
return new WebView()
{
void doGet()
{
System.out.println("Name");
}
};
}
WebView ShowCode()
{
return new WebView()
{
void doGet()
{
System.out.println("Code");
}
};
}
}
最后,JAVA 內(nèi)部類還有一個作用,那就是實現(xiàn)JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內(nèi)部類。通過內(nèi)部類分別繼承一個基類,外部類創(chuàng)建內(nèi)部類的對象,并使用內(nèi)部類的方法,變相地實現(xiàn)了多繼承。