非静态方法可以访问Java中的静态变量/方法吗?
“非靜態方法可以訪問靜態變量或調用靜態方法”是Java中有關靜態修飾符的常見問題之一,答案是, 是的 ,非靜態方法可以訪問靜態變量或調用靜態方法。 Java中的方法。 這沒有問題,因為有靜態成員,即靜態變量和靜態方法都屬于一個類,并且可以根據其訪問修飾符從任何位置調用。
例如,如果靜態變量是私有的 ,則只能從類本身訪問它,但是您可以從任何地方訪問公共靜態變量。 類似地,可以從同一類的非靜態方法中調用私有靜態方法,但是可以從任何地方調用公共靜態方法(例如main()) 。
這是一個代碼示例,用以證明我們的觀點:非靜態方法可以訪問Java中的靜態變量和方法:
public class StaticTest {public static int iStatic = 10;public void nonStatic() {System.out.println("can access static variable inside non-static method : "+ iStatic);main(new String[2]);}public static void main(String[] args) {System.out.println("Inside main method");}}您可以看到該代碼可以正常編譯,沒有編譯時錯誤。 您甚至可以從非靜態方法訪問嵌套的靜態類 ,這絕對好。
但是,只要想一想,如果答案就是這么簡單,那么為什么在Java采訪和Java認證(如OCAJP或OCPJP )中經常問這個問題? 嗯,這個問題有些棘手,并且經常被問到困惑的候選人,因為事實并非如此,即您可以從非靜態上下文訪問靜態成員,但不能從 Java中的靜態方法訪問非靜態變量或方法 。
為什么您不能在Java中訪問非靜態變量或從靜態方法調用非靜態方法? 好吧,這是因為靜態方法形成了一個靜態上下文,在該上下文中只能訪問靜態成員,但是如果您需要更多說明,我建議您學習更全面的資源之一,例如Jim Wilson撰寫的Pluralsight的Core Java Fundamentals課程。
如前所述,代碼是最好的文檔。 嘗試通過編寫代碼來證明這一點,這就是我們在這里要做的。 以下是一個代碼示例,以證明上述觀點:無法從Java中的靜態方法訪問非靜態成員變量或方法:
class Hello {private static int aStaticVariable = 1;private int aNonStaticVariable = 2;private static void aStaticMethod() {System.out.println(aNonStaticVariable);aNonStaticMethod();}private void aNonStaticMethod() {System.out.println(aStaticVariable);}}$ javac Hello.java
Hello.java:11: non-static variable aNonStaticVariable cannot be referenced from a static contextSystem.out.println(aNonStaticVariable);^Hello.java:12: non-static method aNonStaticMethod() cannot be referenced from a static contextaNonStaticMethod();^2 errors您可以看到,即使您可以通過非靜態方法訪問靜態成員 ,但事實并非如此。 如果嘗試訪問非靜態變量或方法甚至嵌套類,則編譯器將引發錯誤“無法從靜態上下文引用非靜態方法XXXX” 。
因此,現在最大的問題是如何在Java中通過main()方法等靜態方法訪問非靜態變量或調用非靜態方法? 讓我們找出答案。
如何從Java中的靜態方法訪問非靜態變量/方法
嗯,有一種通過創建實例從Java靜態上下文訪問任何非靜態成員的合法方法。 您需要首先創建一個類的對象,該類的
您要訪問的非靜態成員 或非靜態方法 。 一旦這樣做,編譯器將不再打擾您,如以下示例所示:
$ javac Hello.java
您可以看到,使用Hello類的對象訪問非靜態變量和方法后,所有編譯時錯誤都消失了。 這是從靜態上下文(例如,靜態初始化程序塊,靜態方法或Java中的嵌套靜態類)訪問非靜態變量/方法的正確方法。 看到
Java:更多細節的核心平臺 。
這就是關于非靜態方法是否可以訪問Java中的靜態變量或方法的全部內容。 當然,它們可以,但事實并非如此,即您不能從靜態上下文(即靜態方法)訪問非靜態成員。 從靜態方法訪問非靜態變量的唯一方法是創建該變量所屬類的對象。
這種困惑是您在核心Java面試以及核心Java認證(例如OCAJP和OCPJP考試)上看到此問題的主要原因。 您將基于OCAJP上的靜態概念發現很多問題,因此,通過閱讀一本好的Java核心書籍(例如Mala Gupta的《 OCAJP學習指南》)來準備好該主題非常重要。 即使您沒有準備考試,這也是學習核心Java基礎知識的一本好書。
進階學習
Java基礎知識第1部分和第2部分
Head First Java第二版
Whizlabs Java 8考試模擬器
翻譯自: https://www.javacodegeeks.com/2017/10/can-non-static-method-access-static-variablemethod-java.html
總結
以上是生活随笔為你收集整理的非静态方法可以访问Java中的静态变量/方法吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统重启系统命令(linux系
- 下一篇: java8optional_关于Java