“非静态方法可以访问静态变量或调用静态方法”是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

非静态方法可以访问Java中的静态变量/方法吗?相关推荐

  1. java中的静态变量方法

    1.什么是静态变量和方法 被关键字static修饰的属性和方法 2.静态变量和实例变量有什么区别? 1.静态变量是被static修饰过的属性 实例变量是没有被static修饰过的属性 2.静态变量在内 ...

  2. java 静态变量方法,java中的静态变量和静态方法

    java中的静态变量和静态方法 发布时间:2020-06-25 20:15:28 来源:亿速云 阅读:100 作者:Leah 今天就跟大家聊聊有关java中的静态变量和静态方法,可能很多人都不太了解, ...

  3. Java中的静态变量静态方法

    静态变量&静态方法 静态变量又叫做类变量,静态方法又被称为类方法--均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 (1)静态方法中不需要它所属类的任何 ...

  4. Java中的静态变量和静态方法

    决定哪些方法或变量声明为静态的,是类设计时的关键步骤. 静态变量(static variable)有时也称为类变量(class variable),它由类的所有实例共享.对于类的所有对象来说,静态变量 ...

  5. java 中的静态变量,静态代码块,动态代码块,构造方法执行顺序的深入探究

    要想完全弄懂这个执行顺序,需要我们先了解几个概念. 首先是类加载与对象的构造,类加载就是在第一次调用这个类的时候jvm虚拟机会通过类加载器在一个叫做方法区的逻辑内存中将所要用到的类的信息存放在里边,其 ...

  6. Java中的静态变量、静态方法问题

    由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员 1.静态方法 无需本类的对象也可以调用此方法,调用形式为"类名.方法名",静态方法常常为 ...

  7. java中的静态变量的作用域_详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  8. java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析

    静态变量初始化顺序 1.简单规则 首先先看一段最普遍的JAVA代码: ? 这里先猜下控制台输出结果是什么? OK, 或许你已经猜到下面了结果了,那么你还是熟悉Java的. 复制代码 代码如下: 0 1 ...

  9. java中的静态变量的作用域_Java基础学习03-变量、常量、作用域

    在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; Java语言支 ...

最新文章

  1. flink链接mysql_flink 将mysql作为Source和Sink的代码示例
  2. 3.3 matlab用switch语句实现选择结构
  3. Competition——互联网比赛(编程相关):国内外各种互联网比赛举办时间、条件、细节等详细攻略
  4. Qt Creator使用自定义字体
  5. MySQL5.7新特性——在线收缩undo表空间 (转载)
  6. jsoup的介绍使用(转)
  7. multism中ui和uo应该怎么表示_王者荣耀:梦泪直播时谈到体验服大改动,表示装备的改动很关键...
  8. parseInt(string, radix)
  9. asp网络编程:用ASP实现网页BBS
  10. iphone录屏没内部声音_6个iPhone隐藏功能,让你的手机好用到飞起
  11. linux 释放进程res_linux下查询进程占用的内存方法总结
  12. 用Arcpy实现空间分析(建立缓冲区为例)
  13. paip.java swt 乱码问题解决
  14. 严蔚敏数据结构C语言版教材精讲考研真题串讲视频
  15. Byond Compare软件
  16. 基于格的密码与SABER
  17. 微信支付快速生成签名sign
  18. 阿里云linux系统目录结构
  19. 全球与中国PH传感器盒市场深度研究分析报告
  20. 邮箱 名字 地址url正则表达式

热门文章

  1. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  2. Apache Druid(一)简介
  3. 你知道void和Void的区别吗
  4. 常用数据库连接串与驱动总结
  5. 都忘了自己还有一套房子了。。。
  6. 当你左右看看没有发现我时,千万千万别往看……
  7. getOrDefault()和subList()
  8. 2019蓝桥杯省赛---java---B---7(外卖店优先级)
  9. 西安理工大学计算机专业毕业,西安理工大学什么专业好找工作?毕业工资大概多少?答案在这里...
  10. (转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别