2011-09-11 82 views
1

我很難理解「靜態」方法和「靜態」變量是什麼,它導致我的代碼出現問題。這裏是代碼我有困難:理解靜態修飾符的問題

public class Document{ 
     public void NewBlank(){ 
      Resources.openRawResource(R.raw.blank); 
      } 
     } 

爲什麼我收到錯誤「不能使靜態參考非靜態方法Resource.openRawResource(INT)離型資源」?爲什麼我不能引用非靜態方法?

回答

3

openRawResources不是靜態方法,它需要在對象中調用,而不是一種。爲了獲得資源實例,您可以在一個活動中調用getResources。然後將所得的代碼將是

Resources resources = myactivity.getResources(); 
resources.openRawResource(R.raw.blank); 

靜態方法/變量是一個屬於所述類型的,而不是這種類型的實例/對象。

+0

好吧,我可以使用上面的代碼,如果代碼是在說,活動?但我的代碼不是。有什麼方法可以簡單地從普通類訪問原始資源嗎?謝謝! –

+0

如果你參考我的代碼,那麼是的。我不這麼認爲,可能會有,但據我所知,沒有上下文對象就無法訪問資源。但是在創建Document類時可以獲取資源,並將其傳遞給它。 –

+0

偉大的我會嘗試! –

1

不能使靜態參考非靜態方法

這意味着,對於調用您嘗試這種方法,你需要這個類的一個實例的引用。 這裏的說明差異的例子:

public class Foo{ 
    public static int staticVariable = 5; 
    public static void methodStatic(){} 
    public void nonStaticMethod(){} 
} 

這裏是你如何使用它們:

Foo.nonStaticMethod(); //can call static method referring to the class itself without having an instance 

Foo f = new Foo(); 
f.nonStaticMethod(); //you need an instance of a Foo class in order to call a non-static method 

爲了什麼關注靜態變量,這些都是不屬於一類的一個實例變量但同一類的所有不同實例之間共享:

Foo a = new Foo(); 
Foo b = new Foo(); 

System.out.println(a.staticVariable); //print 5 
System.out.println(b.staticVariable); //print 5 

a.staticVariable = 10; 
System.out.println(b.staticVariable); //print 10 

(請看看上面只是例子來理解的概念是什麼一個靜態變量是。你會得到警告「以非靜態方式訪問靜態字段」,因爲這不是訪問這些變量的正確方法)

+0

太棒了!這已經解決了混亂。對不起,我會把K-ballo的答案頒給他,因爲他已經明確地解決了我的問題,但是你的建議也給我帶來了很大的幫助。謝謝! –