定義在一個類內部的類叫內部類,包含內部類的類稱為外部類。內部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內部類或外部類繼承與擴展,或者聲明為static、final的,也可以實現特定的接口。static的內部類行為上象一個獨立的類,非static在行為上類似類的屬性或方法且禁止聲明static的方法。內部類可以訪問外部類的所有方法與屬性,但static的內部類只能訪問外部類的靜態屬性與方法。
外部類按常規的類訪問方式使用內部類,唯一的差別是外部類可以訪問內部類的所有方法與屬性,包括私有方法與屬性。如:
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方法;
內部類類似外部類的屬性,因此訪問內部類對象時總是需要一個創建好的外部類對象。內部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:
System.out.println("Print in inner Outer.index=" + pouter.this.index);
System.out.println("Print in inner Inner.index=" + this.index);
如果需要在其他類中訪問內部類,可以使用:
(1)外部類提供創建內部類的方法供其他類使用。如:
// 外部類
pinner getInner()
{
return new pinner();
}
// 其他類
pouter.pinner pi = po.getInner();
pi.Print();
(2)直接創建內部類的對象。如:
pouter po = new pouter();
pouter.pinner pi = po.new pinner();
pi.Print();
內部類可以聲明在外部類的方法中或語句塊中。如果內部類需要訪問包含它的外部類方法或語句塊的局部變量或參數,則該局部變量或參數必須是final的。外部類的其他方法、其他類無法訪問聲明在方法內部或塊內部的內部類。
如果一個類繼承內部類,則創建該類的對象時需提供一個外部類的對象作為構造方法的參數。如:
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);
}
}
如果創建命名的內部類沒有多少實際意義時,可以創建匿名的內部類。比如使用內部類實現接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據實際的情況創建相應的內部類時,可以使用匿名內部類。簡單的示例如下:
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 內部類還有一個作用,那就是實現JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內部類。通過內部類分別繼承一個基類,外部類創建內部類的對象,并使用內部類的方法,變相地實現了多繼承。