非静态方法可以访问Java中的静态变量/方法吗?
“非靜態(tài)方法可以訪問(wèn)靜態(tài)變量或調(diào)用靜態(tài)方法”是Java中有關(guān)靜態(tài)修飾符的常見(jiàn)問(wèn)題之一,答案是, 是的 ,非靜態(tài)方法可以訪問(wèn)靜態(tài)變量或調(diào)用靜態(tài)方法。 Java中的方法。 這沒(méi)有問(wèn)題,因?yàn)橛徐o態(tài)成員,即靜態(tài)變量和靜態(tài)方法都屬于一個(gè)類,并且可以根據(jù)其訪問(wèn)修飾符從任何位置調(diào)用。
例如,如果靜態(tài)變量是私有的 ,則只能從類本身訪問(wèn)它,但是您可以從任何地方訪問(wèn)公共靜態(tài)變量。 類似地,可以從同一類的非靜態(tài)方法中調(diào)用私有靜態(tài)方法,但是可以從任何地方調(diào)用公共靜態(tài)方法(例如main()) 。
這是一個(gè)代碼示例,用以證明我們的觀點(diǎn):非靜態(tài)方法可以訪問(wèn)Java中的靜態(tài)變量和方法:
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");}}您可以看到該代碼可以正常編譯,沒(méi)有編譯時(shí)錯(cuò)誤。 您甚至可以從非靜態(tài)方法訪問(wèn)嵌套的靜態(tài)類 ,這絕對(duì)好。
但是,只要想一想,如果答案就是這么簡(jiǎn)單,那么為什么在Java采訪和Java認(rèn)證(如OCAJP或OCPJP )中經(jīng)常問(wèn)這個(gè)問(wèn)題? 嗯,這個(gè)問(wèn)題有些棘手,并且經(jīng)常被問(wèn)到困惑的候選人,因?yàn)槭聦?shí)并非如此,即您可以從非靜態(tài)上下文訪問(wèn)靜態(tài)成員,但不能從 Java中的靜態(tài)方法訪問(wèn)非靜態(tài)變量或方法 。
為什么您不能在Java中訪問(wèn)非靜態(tài)變量或從靜態(tài)方法調(diào)用非靜態(tài)方法? 好吧,這是因?yàn)殪o態(tài)方法形成了一個(gè)靜態(tài)上下文,在該上下文中只能訪問(wèn)靜態(tài)成員,但是如果您需要更多說(shuō)明,我建議您學(xué)習(xí)更全面的資源之一,例如Jim Wilson撰寫(xiě)的Pluralsight的Core Java Fundamentals課程。
如前所述,代碼是最好的文檔。 嘗試通過(guò)編寫(xiě)代碼來(lái)證明這一點(diǎn),這就是我們?cè)谶@里要做的。 以下是一個(gè)代碼示例,以證明上述觀點(diǎn):無(wú)法從Java中的靜態(tài)方法訪問(wèn)非靜態(tài)成員變量或方法:
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您可以看到,即使您可以通過(guò)非靜態(tài)方法訪問(wèn)靜態(tài)成員 ,但事實(shí)并非如此。 如果嘗試訪問(wèn)非靜態(tài)變量或方法甚至嵌套類,則編譯器將引發(fā)錯(cuò)誤“無(wú)法從靜態(tài)上下文引用非靜態(tài)方法XXXX” 。
因此,現(xiàn)在最大的問(wèn)題是如何在Java中通過(guò)main()方法等靜態(tài)方法訪問(wèn)非靜態(tài)變量或調(diào)用非靜態(tài)方法? 讓我們找出答案。
如何從Java中的靜態(tài)方法訪問(wèn)非靜態(tài)變量/方法
嗯,有一種通過(guò)創(chuàng)建實(shí)例從Java靜態(tài)上下文訪問(wèn)任何非靜態(tài)成員的合法方法。 您需要首先創(chuàng)建一個(gè)類的對(duì)象,該類的
您要訪問(wèn)的非靜態(tài)成員 或非靜態(tài)方法 。 一旦這樣做,編譯器將不再打擾您,如以下示例所示:
$ javac Hello.java
您可以看到,使用Hello類的對(duì)象訪問(wèn)非靜態(tài)變量和方法后,所有編譯時(shí)錯(cuò)誤都消失了。 這是從靜態(tài)上下文(例如,靜態(tài)初始化程序塊,靜態(tài)方法或Java中的嵌套靜態(tài)類)訪問(wèn)非靜態(tài)變量/方法的正確方法。 看到
Java:更多細(xì)節(jié)的核心平臺(tái) 。
這就是關(guān)于非靜態(tài)方法是否可以訪問(wèn)Java中的靜態(tài)變量或方法的全部?jī)?nèi)容。 當(dāng)然,它們可以,但事實(shí)并非如此,即您不能從靜態(tài)上下文(即靜態(tài)方法)訪問(wèn)非靜態(tài)成員。 從靜態(tài)方法訪問(wèn)非靜態(tài)變量的唯一方法是創(chuàng)建該變量所屬類的對(duì)象。
這種困惑是您在核心Java面試以及核心Java認(rèn)證(例如OCAJP和OCPJP考試)上看到此問(wèn)題的主要原因。 您將基于OCAJP上的靜態(tài)概念發(fā)現(xiàn)很多問(wèn)題,因此,通過(guò)閱讀一本好的Java核心書(shū)籍(例如Mala Gupta的《 OCAJP學(xué)習(xí)指南》)來(lái)準(zhǔn)備好該主題非常重要。 即使您沒(méi)有準(zhǔn)備考試,這也是學(xué)習(xí)核心Java基礎(chǔ)知識(shí)的一本好書(shū)。
進(jìn)階學(xué)習(xí)
Java基礎(chǔ)知識(shí)第1部分和第2部分
Head First Java第二版
Whizlabs Java 8考試模擬器
翻譯自: https://www.javacodegeeks.com/2017/10/can-non-static-method-access-static-variablemethod-java.html
總結(jié)
以上是生活随笔為你收集整理的非静态方法可以访问Java中的静态变量/方法吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux系统重启系统命令(linux系
- 下一篇: java8optional_关于Java