-
内部類
在Java語言中,可以把一個類定義到另外一個類的内部,在類裡面的這個類就叫做内部類,外面的類叫做外部類。在這種情況下,這個内部類可以被看成外部類的一個成員(與類的屬性和方法類似)。還有一種類被稱為頂層(Top-level)類,指的是類定義代碼不嵌套在其他類定義中的類。
内部類主要有以下四種:靜态内部類,成員内部類,局部内部類,匿名内部類。其定義方法如下:
class outerClass{
static class innerClass{}//靜态内部類
}
靜态内部類是指被聲明為static的内部類。它可以不依賴于外部類執行個體而被執行個體化,而通常的内部類需要在外部類執行個體化後才能執行個體化。靜态内部類不能與外部類有相同的名字,不能通路外部類·的普通成員變量,隻能通路外部類中的靜态成員和靜态方法(包括私有類型)
class outerClass{
class innerClass{}//成員内部類(普通内部類)
}
一個靜态内部類,如果去掉static關鍵字,就成為成員内部類。成員内部類為非靜态内部類,它可自由引用外部類的屬性和方法,無論這些屬性和方法是靜态的和非靜态的。但是它與一個執行個體綁在了一起,不可以定義靜态的屬性和方法。隻有在外部的類被執行個體化後,這個内部類才能被執行個體化。注意:非靜态内部類中不能有靜态成員。
class outerClass{
public void memberFunction(){
class innerClass{}//局部内部類
}
}
局部内部類指的是定義在一個代碼塊内的類,其作用範圍為其所在的代碼塊,是内部類中使用較少的一種類型。局部内部類像局部變量一樣,不能被public,protected,private,static修飾,隻能通路方法中定義為final類型的局部變量。
public class MyFrame extends Frame{
//外部類
public MyFrame(){
addWindowListener(new WindowAdapter()
{//匿名内部類
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}
}
匿名内部類是一種沒有類名的内部類,不使用關鍵字class,extends和implements,沒有構造方法,它必須繼承其他類或實作其他接口。匿名内部類的一般好處是使代碼更加簡潔緊湊,但易讀性下降。一般應用于GUI(圖形使用者界面)程式設計中實作事件處理等。
-
Java程式初始化
在Java語言中,當執行個體化對象時,對象所在類的所有成員變量首先要進行初始化,隻有當所有類成員完成初始化後,才會調用對象所在類的構造函數建立對象。
觀察以下代碼:
public class HelloB extends HelloA{
public HelloB(){
System.out.println("HelloB");
}
{
System.out.println("I'm class B");
}
static{
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloA{
public HelloA(){
System.out.println("HelloA");
}
{
System.out.println("I'm class A");
}
static{
System.out.println("static A");
}
}
Java程式的初始化一般遵循以下三個原則(以下三原則優先級依次遞減):Java程式初始化工作可以在許多不同的代碼塊中完成(例如靜态代碼塊,構造含數)他們執行的順序如下:父類靜态變量,父類靜态代碼塊,子類靜态變量,子類靜态代碼塊-,父類非靜态變量,父類非靜态代碼塊,父類構造函數,子類非靜态變量,子類非靜态代碼塊,子類構造函數
- 靜态對象(變量)優先于非靜态對象(變量)初始化,其中,靜态對象隻初始化一次,而非靜态對象(變量)可能會初始化多次;
- 父類優先于子類進行初始化;
- 按照成員變量定義順序進行初始化,即使變量定義散布于方法定義中,它們依然在任何方法(包括構造方法)被調用之前請初始化。、
綜上:上述程式運作結果為