1. 程式人生 > >java 靜態方法呼叫非靜態內部類報錯

java 靜態方法呼叫非靜態內部類報錯

Error:

No enclosing instance of type *** is accessible. Must qualify the allocation with an enclosing instance of type *** (e.g. x.new A() where x is an instance of Test).

[***代表類名]

public class Test
{
	public static void main(String[] args)
	{
		/**第一句沒問題*/
		A a = new A();
		/**第二句錯誤資訊:
		 * No enclosing instance of type Test is accessible. 
		 * 【沒有Test型別可以被訪問】
		 * Must qualify the allocation with an enclosing instance of type Test 
		 * (e.g. x.new A() where x is an instance of Test).
		 * 【就是說Test的例項不存在,所以Test類的內部類是更是無從談起】
		 * 【而A類不同A和main方法一樣都在棧中可以被訪問到(並不需要首先例項化Test類)】
		 * */
		B b = new B();
		
	}

	static class A
	{
		public A()
		{
			System.out.println("我是靜態內部類的空引數建構函式");
		}
	}

	class B
	{
		public B()
		{
			System.out.println("我是非靜態內部類的空引數建構函式");
		}
	}
}


參考:http://baike.baidu.com/link?url=wj-ZWDuDFKakckKytRRARWqNKpDr5LzHOCgKzxWl4WHBV4RLxOyGpSOydMmWPK1myEJkEbu_XkCZiuns617aYa點選開啟連結

JAVA語言中編輯

有時你希望定義一個類成員,使它的使用完全獨立於該類的任何物件。通常情況下,類成員必須通過它的類的物件訪問,但是可以建立這樣一個成員,它能夠被它自己使用,而不必引用特定的例項。在成員的宣告前面加上關鍵字static(靜態的)就能建立這樣的成員。如果一個成員被宣告為static,它就能夠在它的類的任何物件建立之前被訪問,而不必引用任何物件。你可以將方法和變數都宣告為static。static 成員的最常見的例子是main()。因為在程式開始執行時必須呼叫main() ,所以它被宣告為static。 宣告為static的變數稱為
靜態變數
類變數。可以直接通過類名引用靜態變數,也可以通過例項名來引用靜態變數,但最好採用前者,因為後者容易混淆靜態變數和一般變數。靜態變數是跟類相關聯的,類的所有例項共同擁有一個靜態變數。 宣告為static的方法稱為靜態方法或類方法。靜態方法可以直接呼叫靜態方法,訪問靜態變數,但是不能直接訪問例項變數和例項方法。靜態方法中不能使用this關鍵字,因為靜態方法不屬於任何一個例項。靜態方法不能被子類的靜態方法覆蓋。 舉例 如果你需要通過計算來初始化你的static變數,你可以宣告一個static塊,Static 塊僅在該類被載入時執行一次。下面的例子顯示的類有一個static方法,一些static變數,以及一個static 初始化塊: // Demonstrate static variables,methods,and blocks.class UseStatic{ static int a = 3; static int b; static void meth(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } static { System.out.println("Static block initialized."); b = a * 4; } public static void main(String args[]) { meth(42); }} 一旦UseStatic 類被裝載,所有的static語句被執行。首先,類屬性變數開始賦值,a被設定為3,b預設初始化為 0 ,接著執行static 塊,執行(列印一條訊息),最後,b被初始化為a*4 或12。然後呼叫main(),main() 呼叫meth() ,把值42傳遞給x。3個println () 語句引用兩個static變數a和b,以及
區域性變數
x。 注意:在一個static 方法中引用任何例項變數都是非法的。 下面是該程式的輸出: Static block initialized.x = 42a = 3b = 12 使用 static修飾符宣告屬於型別本身而不是屬於特定物件的靜態成員static修飾符可用於類、欄位、方法、屬性、運算子、事件和建構函式,但不能用於索引器解構函式或類以外的型別。例如,下面的類宣告為 static,並且只包含 static方法。 例如: static class CompanyEmployee{public static string GetCompanyName(string name) { ... }public static string GetCompanyAddress(string address) { ... }} 一般來說,類中標註了static的函式與變數能在類外直接引用,比如說: String M_string1 =CompanyEmployee.GetCompanyName(M_string2) 而沒有標註static的函式則必須宣告一個類的實體,有實體來引用。比如說: static class CompanyEmployee{public string GetCompanyName(string name) { ... } //沒有Staticpublic static string GetCompanyAddress(string address) { ... }}CompanyEmployee M_CompE = new CompanyEmployee()String M_string1 =M_CompE.GetCompanyName(M_string2)靜態類

希望路過的大牛多多批評指正。