非静态方法可以访问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静态上下文访问任何非静态成员的合法方法。 您需要首先创建一个类的对象,该类的
您要访问的非静态成员 或非静态方法 。 一旦这样做,编译器将不再打扰您,如以下示例所示:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

which oracle linux,(总结)Linux下Oracle11gR2的ORA-00845错误解决方法

PS:前些时间一台演示环境的Oracle 11g for Linux不知什么原因,启动不起来,报错ORA-00845。搜索了下,这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小。当时解决了没空写总结,今天有点空,总结分享…

oracle存储过程深入,深入了解oracle存储过程的优缺点

定义:存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程…

如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然。 解析日期表示您有一个表示日期的字符串,例如“ 2017-08-3”,并且要将其转换为表示Java中日期的对象,例如Java 8之前版本中的java.util.Date以及LocalDate或Loca…

如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...

数控刀具选用概述学习数控相关知识,最基础的是认识和了解刀具的材料以及选用原则,我们应当了解数控刀具的种类及特点、如何正确选择和使用数控加工刀具;学会根据被加工材料来合理选择数控刀具的材料和切削参数。选用原则:数控车床…

Java命令行界面(第27部分):cli-parser

CLI Parser最初托管在Google Code上,现在已存档在Google Code上 ,现在可以在GitHub上使用 。 归档的Google Code项目页面将CLI解析器描述为“使用非常简单,非常小的依赖项”,它使用注释“使非常简洁的主要方法不需要知道如何解析带…

使用2.26内核的linux,介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法

介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法来源:互联网作者:佚名时间:2013-04-10 13:32这篇升级Linux内容的文章,是基于Red Hat的Linux版本,从linux 2.6.9-42内核升级到linux 2.6.26-42的方法,对于…

Java命令行界面(第1部分):Apache Commons CLI

尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本,但是有时候我需要解析Java应用程序中的命令行参数,并且有很多库可供Java开发人员用来解析命令行参数。 在本文中,我将介绍这些Java命令行解析库中最著名的一种: Apache Comm…

丙烯怎么做成流体丙烯_韧性好强度高的聚丙烯复合材料怎么做?让人工智能来帮忙...

01背景介绍聚丙烯(PP)是一种应用广泛的通用塑料,价格便宜、力学性能好、热稳定性高,在机械、汽车、电子电器、建筑、纺织、包装和食品工业等领域应用广泛。聚丙烯韧性和冲击强度不高,限制了它的应用。加入热塑性弹性体(TPE),如苯乙…

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前,vivado已推出2019.1版本,实验室所安装的为2018.3版本,由于软件向下兼容的特性,建议安装2018版本,若安装2019版本,请自带笔记本,安装过程与之前没有差别,这…

嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

使用select机制监控是否语音识别结果,在超出等待时间后,会退出等待并重新初始化语音模块LD3320,释放公共资源,这样也使得系统能够及时响应LD3320的MP3播放功能,避免了在长时间没有语音识别结果时,系统进入卡…

windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

每当我问到客户,“你用什么存储产品作为文件共享?”经常听到的一个答案(自豪滴)是,“文件共享需要存储么?我们用Windows就可以做到。”Windows就是个百宝箱,什么都能往里装,就像你家冰箱一样。众所周知&…

pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展

土壤营养元素流失、重金属污染是当前全球面临的突出环境问题。生物炭因其具有比表面积较大、吸附性能高和成本低等优点而在环境修复领域日益受到广泛关注,被作为水处理吸附剂、土壤修复改良剂广泛应用于农业土壤改良和环境中重金属的修复和钝化。但通常情况下&#…

Java命令行界面(第26部分):CmdOption

由于Tweet,我了解了本系列中第26个基于Java的功能强大的库,该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的,用于Java 5应用程序的简单注释驱动的命令行解析器工具包。” 该项目的副标题是“命令行解析从未…

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止

C.62: Make copy assignment safe for self-assignmentC.62:保证拷贝赋值对自我赋值安全Reason(原因)If x x changes the value of x, people will be surprised and bad errors will occur (often including leaks).如果xx改变了x的值,人们会觉得很奇怪&#xff0…

华为编程规范_华为 Java 编程规范出炉,究竟和官方文档有何不同?

来源:blog.csdn.net/chenleixing/article/details/441739851、引言这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司,十几万员工,无论是人事管理,还是代码管理&#xff0c…

Java命令行界面(第19部分):jClap

本系列中第19篇文章的重点是从Java代码解析命令行参数是jClap ( Java命令行参数解析器 ),不应将它与称为JCLAP的库相混淆,而JCLAP库是我本系列先前文章的重点。 在以前的帖子覆盖JCLAP 1.4加尔斯吉尔温斯坦利( snaq.ne…

Java命令行界面(第22部分):argparser

John Lloyd的argparser是本系列的第二十二篇有关基于Java的命令行参数解析的文章中介绍的库。 该库的主页除了提供单个源代码示例外,还提供了指向基于Javadoc的API文档 ,JAR文件,ZIP文件和TAR文件的链接。 本帖子中使用的示例与本系列的前二十…

如何粗暴地下载huggingface_hub指定数据文件

参考这里: https://huggingface.co/docs/huggingface_hub/guides/download 可见下载单个文件,下载整个仓库文件都是可行的。 这是使用snapshot_download下载的一个例子: https://qq742971636.blog.csdn.net/article/details/135150482 sn…

顺序表输入栈元素c语言,C语言数据结构之栈简单操作

C语言数据结构之栈简单操作实验:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称…

25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势

存储虚拟化是一种对物理存储资源进行抽象的技术,使其看起来像是一个集中的资源。虚拟化掩盖了管理内存、网络、服务器和存储中资源的复杂性。存储虚拟化运行在多个存储设备上,使它们看起来就像一个单一的存储池。这些池化的存储设备可以来自不同的供应商…