静态方法不能调用非静态方法的原因

2023-11-06

静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。


延伸一个相似的例子吧,在做一个笔试的时候遇到的问题:

有下面这样的程序:

public class Test{

private static void Print(){
System.out.println("Print()");
}

public static void main(String[] args) {

((Test)null).Print();

}

}

问输出什么?

//输出是Print()

当时看到这道题的时候真的是万脸懵逼,为什么类名那里还要加一个null,为什么不是直接Test.Print(),还以为这样写会报错,然而并不是。经过查资料和某人的帮助,终于明白啦。

(1)首先,我们可以试一下去掉static,这里不会编译错误,但是运行时会抛出空指针异常,原因是什么呢,原因就是类似于上面说的静态方法不能调用非静态方法的原因了。我们很容易被null转移了视线,这里与null的关系不大(这是因为是静态方法,null没有影响),null是为了告诉我们这里的引用没有指向任何地方或者说还未初始化,也就是说对象未创建,从上面对象的创建过程可以知道,如果对象还未创建,则不会有this指针的引用,因此会报空指针异常。

(2)这里用null的话(即(Test)null)是将Test引用强制转换为Test对象,这样也可以调用静态方法,其实不需要null,也是可以调用静态方法的,即Test.Print()。


另外补充一下我觉得很有必要知道的null的知识:

(1)null可以被强制转换为任何引用类型。

(2)任何含有null值的包装类在自动拆箱成基本数据类型时都会抛出一个空指针异常

(3)不能用一个值为null的引用类型变量来调用非静态方法,这样会抛出空指针异常,但是静态方法可以被一个值为null的引用类型变量调用而不会抛出空指针异常。这和对象的创建和静态方法以及非静态方法之间的关系有关。也就是上面说的那些。

下面这个链接是对null的一些解析,挺好的。

http://www.importnew.com/14229.html

下面这个链接是那道笔试题的一些讨论

https://www.nowcoder.com/questionTerminal/e252668ee94947bea07edd7300340115


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态方法不能调用非静态方法的原因 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • navicat使用触发器在插入记录修改某个字段的值

    最近项目遇到了一个问题 查用户的某些字段有NULL会报错 所以想在注册的时候用的触发器提前设置一个默认值 避免空指针 先在本地建一个测试表t 1 就给三个基本字段 然后右击表选择设计表找到 触发器 开始编辑 现在的写法是正确的 我之前是这样
  • B站马士兵python入门基础版详细笔记(4)

    前言 这篇文章是B站学习python入门基础班的视频的第四章内容 主要讲述的是if else语句 但是不包括循环结构 循环结构在下一章笔记中有记叙 一 顺序结构 什么是顺序结构呢 比如说 把大象装冰箱需要分几步 print 程序开始 pri
  • 数模比赛提分tips

    1 对于模型的建立和求解 这一部分是文章的重点 要特别突出你的创造性的工作 在这部分写作需要注意的事项有 一定要有分析 而且分析应在所建立模型的前面 一定要有明确的模型 不要让别人在你的文章中去找你的模型 关系式一定要明确 思路要清晰 易读
  • 指针进阶(三)

    指针进阶 三 指针习题组 01 int main int a 5 1 2 3 4 5 int ptr int a 1 printf d d a 1 ptr 1 return 0 运行结果 原因 这里a是数组名 存放的是数组的首地址 a是整个
  • pip install tensorflow报错ERROR: Could not find a version that satisfies the requirement tensorflow (f

    这里写目录标题 报错内容 解决方法 其他方法 原因分析 报错内容 pip3 install tensorflow 输入上述命令安装tensorflow后出现下面的报错 ERROR Could not find a version that
  • chrome浏览器被hao123劫持如何解决?

    那天上班 打开电脑点开chrome浏览器 首页出现的是我熟悉的谷歌搜索页面 可是很快右边又打开了一个页面 123 hao234 com 这个流氓网站就这个这么不请自来了 而且之后我用尽了网上各种办法都弄不走 各种无效方法 1 绑定自己的主页
  • 背包九讲--混合背包、分组背包、资源分配背包、背包方案总数

    混合背包 混合背包 问题描述 一个旅行者有一个最多能用V公斤的背包 现在有n件物品 它们的重量分别是W1 W2 Wn 它们的价值分别为C1 C2 Cn 有的物品只可以取一次 01背包 有的物品可以取无限次 完全背包 有的物品可以取的次数有一
  • hive基础(二) hive操作大全

    目录 注 只是为了以后忘了 好翻 做个总结 一 hive 操作 1 hive e 2 hive f 3 查看在hive中输入的所有历史命令 4 hive运行日志修改 二 hive参数配置 三 hive数据类型 基本数据类型 集合数据类型 1
  • PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理

    error reporting函数确定报告的敏感级别 共有16个不同级别 这些级别的任何组合都是有效的 error reporting函数使用 字符表示逻辑操作符NOT error reporting E ALL E STRICT 希望报告
  • python两列表对应元素求和

    一种方法是循环 但是有简便方法 用numpy import numpy as np list1 1 2 3 4 list2 1 2 3 4 a array np array list1 b array np array list2 c ar
  • matlab安装好 启动总是闪退_win10系统启动matlab出现闪退的处理技巧

    电脑操作系统在使用的时候经常会被一些问题所困扰 例如很多用户都遇见过win10系统启动matlab出现闪退的问题 大部分用户如果第一次碰到win10系统启动matlab出现闪退的现象 因此大伙都会不知所措 怎么才可以完善的治理win10系统
  • 设计模式之状态模式(思想)

    设置模式之状态模式 上图学过网络的同学应该都比较清楚吧 这是一张TCP状态转换图 只要理解上图 那么对状态模式也就很容易理解啦 状态模式的意图 允许一个对象在其内部状态改变时改变它的行为 简单的说就是 一个人他的外表没有改变 但是他内在的心
  • batch-命令的学习

    batch命令的扩充变量语法 所谓扩充变量语法 是指对已有参数 环境变量或其他变量的引用 的再处理 扩展 对比与java语言 可以理解为 对传入参数的格式化 扩充变量只能针对于传入变量的自身属性 自身的引用 值 变量代表的文件位置信息 进行
  • 深入理解Flutter的GestureDetector组件

    引言 上一篇文章 深入理解Flutter的Listener组件 介绍了触控事件的监听原理 让我们对Flutter中触摸事件的传递过程有了进一步的认识 今天我们学习一下手势识别组件GestureDetector的原理 GestureDetec
  • 苏州大学邮箱注册JetBrain, 永远使用专业版

    今天发现 使用教育邮箱 可以免费使用JetBrain的专业版 作为苏大的学生 尤其是计算机学院的不要错过哦 注意 只是针对苏州大学的学生 毕业之后可以开通校友邮箱 相当于以后可以一直使用专业版 每年激活一次 1 开通邮箱 a 登陆网址 ht
  • PAT打卡--L1-016查验身份证(c++)

    原题链接 这道题其实也是一道简单题 我主要还是用其来学习C 通过这道题 了解到了c 中的字符和int之间的转换 首先贴上代码吧 include
  • spring data jpa 自定义接口实现

    没错 spring data jpa很优秀 但有一些东西 我们就想自己来 我除了想用你的 还想用我自己的 首先 我要spring data jpa的接口 为什么 因为很方便啊 public interface TaskDao extends
  • ORA-04088(ORA-04084): cannot change NEW values for this trigger type

    gt gt gt bug背景 gt gt gt bug来源一个定时任务的删除操作 这里需要删除原来数据 然后插入定时采集到的数据 因采集到的数据中没有id这个字段 所以插入这个过程需要借助oracle的触发器 来自动生成一个id 最终我写的
  • js(react)中使用百度地图

    0 需求 依次点击区 镇 小区 展示当前位置的数据列表 移动地图 movestart事件 隐藏详情 1 准备工作 1 1 引入百度地图并配置ak jspopularGL 百度地图API SDK 1 2 根据IP定位获取当前定位 import
  • 静态方法不能调用非静态方法的原因

    静态方法是属于类的 即静态方法是随着类的加载而加载的 在加载类时 程序就会为静态方法分配内存 而非静态方法是属于对象的 对象是在类加载之后创建的 也就是说静态方法先于对象存在 当你创建一个对象时 程序为其在堆中分配内存 一般是通过this指