通過直接訪問,我的意思是爲什麼他們不能訪問實例變量而不使用字段所屬類的實例? 如果可能,請根據記憶回答。爲什麼靜態方法和靜態嵌套類不能直接訪問實例變量?
回答
非靜態字段位於每個實例中,其他位置無。
在靜態方法中,您沒有對實例的默認引用,所以方法無法知道您想要哪個實例。
問題不是地址或內存的問題,這是一個邏輯問題。
這就好像在說:「我不會迷路,我只是不知道自己在哪裏,請使用地圖來解釋它。」
因此,非靜態方法對實例有默認引用? – 2013-05-11 22:04:27
@KacyRaye外部類對'this'的引用在許多情況下是可選的。嵌套類也可以引用其外部類。在JVM級別,「this」作爲第一個參數傳遞給您。 – 2013-05-11 22:06:43
這很簡單。沒有實例,沒有任何可訪問的東西。
或者就內存而言:您嘗試訪問的內容在內存中不存在。
編輯
如果像@Alnitak以下建議,是在某個地方的實例,這不利於在所有。您需要參考特定的JVM實例才能找到它的成員。
它也是保持命名空間清晰。即使它們是靜態的,如果程序試圖訪問方法/類,你仍然會編譯錯誤。
拿這個程序,例如:
public class Test {
public static void main(String[] args) {
double d = Math.random();
System.out.println(d);
}
}
很明顯,你可以調用Math.random()而不必創建Math類的實例; random()是一個靜態方法,這意味着它不綁定到類的實例,它可以在沒有綁定的情況下使用。因此它不能訪問Math實例的變量,因爲它應該使用哪個實例?可能有數百個或根本沒有。
靜態內部類也是如此,它們沒有綁定到外部類的實例,可以獨立創建和使用。
- 1. 靜態嵌套類的(實例)可以訪問外部靜態變量嗎?
- 2. 爲什麼靜態類不能有非靜態方法和變量?
- 3. 爲什麼派生類不能訪問基類靜態方法?
- 4. 從另一個類從靜態方法訪問實例變量
- 5. 我們是否可以從靜態嵌套類訪問非靜態嵌套類的非靜態方法
- 6. 從C++中的靜態方法訪問非靜態類變量
- 7. 爲什麼實例方法不能覆蓋靜態方法
- 8. 爲什麼靜態方法不能引用實例方法?
- 9. 實現AsyncTask的正確方法是什麼?靜態或非靜態嵌套類?
- 10. 嵌套類的接口靜態方法
- 11. 靜態方法不能訪問類的實例成員
- 12. 爲什麼不能通過實例變量訪問共享/靜態成員?
- 13. 訪問靜態類變量
- 14. 靜態方法不能實現接口方法,爲什麼?
- 15. 什麼是靜態方法和變量?
- 16. 爲什麼靜態嵌套類?
- 17. 爲什麼非靜態方法可以訪問靜態字段?
- 18. 嵌套類和靜態方法
- 19. 爲什麼非靜態變量不能在靜態方法內初始化?
- 20. 非靜態類實例中的c#靜態變量的行爲是什麼?
- 21. 靜態方法的Java實例變量
- 22. 爲什麼我不能訪問靜態變量?
- 23. 是否可以通過靜態方法訪問實例變量?
- 24. 訪問嵌套的靜態常量
- 25. 訪問靜態變量的Const方法
- 26. 靜態方法vs靜態實例
- 27. 靜態嵌套類訪問拋出NoClassDefFoundError
- 28. 從靜態方法訪問非靜態成員變量
- 29. 訪問靜態變量從靜態方法
- 30. 靜態類中的靜態變量和非靜態類中的靜態變量
因爲沒有。不是一個真正的問題。 – EJP 2013-05-12 00:39:06