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

静态方法不能调用非静态方法的原因相关推荐

  1. java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...

    这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...

  2. @value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?

    这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...

  3. php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发

    php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...

  4. 静态方法中调用非静态方法

    我们都知道,静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-s ...

  5. java 静态调用非静态方法_java中静态方法中调用非静态方法的详解

    首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...

  6. java中静态方法中调用非静态方法的详解

    静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...

  7. static静态方法(1)——c#静态方法怎么调用非静态方法

    一般情况下Sta()是不能调用NoSta()的,但是可以通过增加一个静态成员来调用. class B {private static B instance=new B();public static ...

  8. php静态方法调用变量吗,php静态方法怎么调用非静态变量?

    php中,静态方法可以使用self关键词来调用非静态变量,例"self::$name":一个方法被"self::"后,它就自动转变为静态方法.注:静态方法不能调 ...

  9. Java中的静态方法为什么不能调用非静态方法

    hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师. 昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题,我听完后觉得还挺有意思的,分享给大家 小佬们先别急着看我的分析,先自己想想答案 你 ...

最新文章

  1. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类
  2. 第十六届全国大学生智能车竞赛文化衫LOGO主图案设计
  3. Nginx配置:nginx如何配置跳转fpm
  4. 大班运用计算机教学案例,幼儿园大班体验课程教学案例
  5. ZYNQ7000程序编译成功但烧写报错(使用Vitis2020.2)
  6. springMVC3.0(文件上传,@RequestMapping加参数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传参,ajax,拦截器)
  7. grid系列--删除
  8. android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...
  9. 金山笔试题-字符串排序 : 写一个函数,实现对给定的字符串(字符串里面包括:英文字母,数字,符号)的处理...
  10. PHP三元运算符 isset($_GET['id']) ? $_GET['id'] : ”
  11. Android实现本地推送通知的解决方案
  12. 固定资产管理员计算机应用,浅谈计算机在固定资产管理中应用.doc
  13. 查询天气预报的php代码,jQuery输入城市查询天气预报代码
  14. 桌面文件不见了怎么恢复,用它不慌张!
  15. mac已安装flash控件_如何在Mac上安装和更新Flash
  16. Python计算某年某月某日天数
  17. 假币问题python
  18. 半色调技术简介(一)
  19. 2019亚信科技java实习面试笔试经验分享(已成功入职)
  20. Linux ftp服务器虚拟用户的建立

热门文章

  1. [蓝桥杯][2013年第四届真题]带分数(DFS,next_permutation两种方法)
  2. 小符MYSQL的笔记
  3. websocketapp保活,还没吃透内存缓存LruCache实现原理的看这篇文章,看完直呼内行
  4. Microsoft Flow | 微信 | LDP 整合开发
  5. ubuntu 8.04 配置okl4编译环境
  6. sqlsever2000和mysql_数据库迁移 SQLServer2000到MYsql
  7. python怎么下载安装mac_mac下PYTHON安装
  8. 常见文件传输协议(ftp、tftp、scp)及其特点
  9. 遮罩层——通过阴影弱化背景的四种方案
  10. C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析