非静态方法可以访问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,一经查实,立即删除!

相关文章

php中$_post怎么用,php – 如何在$_POST []中使用变量

我需要遍历一堆动态生成的字段,但这不起作用:$population_density $_POST[$current_location_id];我有一个页面列表,其人口在一页上;我需要这样做,这样你就可以立刻更新它们.所以我使字段名称动态地对应于location_id.提交帖子时,我需要像这样迭代它们,但似乎你不能…

python输入字母终止_将用户输入限制为字母

我是学python的技术作家。我想写一个验证姓名字段输入的程序,作为实践,将用户输入限制为字母。我在这里看到了一个类似的验证数字(年龄)字段的代码,并将其用于字母表,如下所示:import stringimport rer re.compile(r[…

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

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

oracle编程基本语法,oracle编程基础语法

oracle数据开发编程结构: declare[定义变量]begin[逻辑代码]exception[捕获异常]end;实例:declarea number:1;b number:2;c number;beginc:(a*b)/(ab);dbms_output.put_line(c);exceptionwhen zero_divide thendbms_output.put_line(除数不能…

java8optional_关于Java 8的Optional的介绍

java8optional我最近发现了JDK 8中Optional类型的添加。 Optional类型是避免NullPointerException一种方法,因为从方法中获取Optional返回值的API使用者被“强制”执行“在线”检查,以消耗其实际返回值。 更多细节可以在Javadoc中看到。 可以在此博客文章…

python大文件排序_python实现按创建时间对文件排序

测试中,测试log是经常需要保存一段时间以便于后续查询,但是如果一段时间不删除,会导致硬盘空间变小而影响自动化测试,通常空间太小,自动化测试case就不能调用了,或者即使调用,可能会引起新测试的…

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解析器描述为“使用非常简单,非常小的依赖项”,它使用注释“使非常简洁的主要方法不需要知道如何解析带…

linux系统中如何安装qwt,linux下Qt开发环境中qwt库的安装与使用

qwt的安装与使用安装好qt开发环境后,先去下载qwt库源代码。以我下载的qwt-6.0.1.zip为例,解压得到qwt-6.0.1。1.安装qwt-6.0.1执行下面的命令:1 cd qwt-6.0.12 qmake3 make4 make install这样就完成qwt-6.0.1的安装了,安装的路径是…

moxy json介绍_MOXy的对象图和动态JAXB

moxy json介绍JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如DynamicEntity之类的映射实例代替真实的类​​。 您可以使用采用属性名称的get和…

linux 查看服务器作业,linux – 如何在服务器负载较低时运行作业?

我有一个运行磁盘快照的命令(在EC2上,冻结XFS磁盘并运行EBS快照命令),该命令设置为作为cron作业定期运行.理想情况下,如果在任务计划运行时磁盘被大量使用,我希望能够将命令延迟一段时间.我担心使用nice / ionice可能没有正确的效果,因为我希望脚本在运行时以高优先级运行(即等…

wordcloud python3.6能用吗_Python3.6环境下安装wordcloud模块遇到的问题及解决办法

“error: Microsoft Visual C 14.0 is required…”问题解决今天在Python 3.6环境中,制作词云,需要安装wordcloud模块,在安装的过程中遇到了“error: Microsoft Visual C 14.0 is required…” 的问题,很是烦恼,最后找…

使用基本身份验证来保护Spring Boot REST API

这是我的Spring Boot Blog帖子系列的第三篇文章。 在第一篇文章中,我谈到了我使用Spring Boot创建RESTFul Services的经验。 然后我将样本扩展到 与Swagger文档集成 。 在这篇文章中,我将在安全方面扩展上述示例。 什么是API安全性 API安全性广泛&…

使用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的方法,对于…

python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel

1.首先安装xlrd\xlwt模块xlrd模块下载地址:https://pypi.python.org/pypi/xlrdxlwt模块下载地址:https://pypi.python.org/pypi/xlwtlinux 安装命令 python setup.py installwindos 安装命令 setup.py install2.使用方法大全基础方法推荐请看这里:http://blog.csdn.net/mr__fan…

linux时间路径,关于linux中的时间 时区问题

本文部分来源于: http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html系统是fedora:glibc实现了从RTC时间到人可读时间的一个转换,一般系统不适用 环境变量TZ进行时区的设置,因为环境变量存在一些缺陷&#xff…

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

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

python自带的idle输入python_打开python自带IDLE出的问题

打开python自带IDLE编辑器时出的问题IDLE cant bind to a TCP/IP port, which is necessary tocommunicate with its Python execution server. This might bebecause no networking is installed on this computer. Run IDLEwith the -n command line switch to start without…