静态方法不能调用非静态方法的原因
静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过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
静态方法不能调用非静态方法的原因相关推荐
- java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...
这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...
- @value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?
这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...
- php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...
- 静态方法中调用非静态方法
我们都知道,静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-s ...
- java 静态调用非静态方法_java中静态方法中调用非静态方法的详解
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...
- java中静态方法中调用非静态方法的详解
静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...
- static静态方法(1)——c#静态方法怎么调用非静态方法
一般情况下Sta()是不能调用NoSta()的,但是可以通过增加一个静态成员来调用. class B {private static B instance=new B();public static ...
- php静态方法调用变量吗,php静态方法怎么调用非静态变量?
php中,静态方法可以使用self关键词来调用非静态变量,例"self::$name":一个方法被"self::"后,它就自动转变为静态方法.注:静态方法不能调 ...
- Java中的静态方法为什么不能调用非静态方法
hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师. 昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题,我听完后觉得还挺有意思的,分享给大家 小佬们先别急着看我的分析,先自己想想答案 你 ...
最新文章
- java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类
- 第十六届全国大学生智能车竞赛文化衫LOGO主图案设计
- Nginx配置:nginx如何配置跳转fpm
- 大班运用计算机教学案例,幼儿园大班体验课程教学案例
- ZYNQ7000程序编译成功但烧写报错(使用Vitis2020.2)
- springMVC3.0(文件上传,@RequestMapping加参数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传参,ajax,拦截器)
- grid系列--删除
- android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...
- 金山笔试题-字符串排序 : 写一个函数,实现对给定的字符串(字符串里面包括:英文字母,数字,符号)的处理...
- PHP三元运算符 isset($_GET['id']) ? $_GET['id'] : ”
- Android实现本地推送通知的解决方案
- 固定资产管理员计算机应用,浅谈计算机在固定资产管理中应用.doc
- 查询天气预报的php代码,jQuery输入城市查询天气预报代码
- 桌面文件不见了怎么恢复,用它不慌张!
- mac已安装flash控件_如何在Mac上安装和更新Flash
- Python计算某年某月某日天数
- 假币问题python
- 半色调技术简介(一)
- 2019亚信科技java实习面试笔试经验分享(已成功入职)
- Linux ftp服务器虚拟用户的建立
热门文章
- [蓝桥杯][2013年第四届真题]带分数(DFS,next_permutation两种方法)
- 小符MYSQL的笔记
- websocketapp保活,还没吃透内存缓存LruCache实现原理的看这篇文章,看完直呼内行
- Microsoft Flow | 微信 | LDP 整合开发
- ubuntu 8.04 配置okl4编译环境
- sqlsever2000和mysql_数据库迁移 SQLServer2000到MYsql
- python怎么下载安装mac_mac下PYTHON安装
- 常见文件传输协议(ftp、tftp、scp)及其特点
- 遮罩层——通过阴影弱化背景的四种方案
- C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析