“非静态方法可以访问静态变量或调用静态方法”是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静态上下文访问任何非静态成员的合法方法。 您需要首先创建一个类的对象,该类的
您要访问的非静态成员 或非静态方法 。 一旦这样做,编译器将不再打扰您,如以下示例所示:
public class Hello {private static int aStaticVariable = 1;private int aNonStaticVariable = 2;private static void aStaticMethod() {Hello object = new Hello();System.out.println(object.aNonStaticVariable);object.aNonStaticMethod();}private void aNonStaticMethod() {System.out.println(aStaticVariable);}}
$ 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