hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师。

昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题,我听完后觉得还挺有意思的,分享给大家

小佬们先别急着看我的分析,先自己想想答案

你是不是想说

因为静态方法是属于类的,而非静态方法属于实例对象

哈,有人这样回答了,勇哥表示不满意。你这样回答,离正确答案,就差那么一句话。说出来了,就表示你知道了。哪句话呢?

临门一脚

JVM是如何调用Java方法的呢?咱们不把call_stub、entry_point、执行流扯进来,伪代码大概是这样
构建运行环境->调用Java方法

构建运行环境做什么呢?比如是否需要触发类初始化、通过符号引用找到method对象,将method对象这个直接引用进行缓存、创建栈帧、拷贝参数……

不管是非静态方法,还是静态方法,JVM都是按这个流程进行调用。区别就在于构建运行环境这里。如果调用的是非静态方法,构建运行环境会多做一步:给this指针赋值。为了帮助大家理解这段话,我从我手写的JVM中把这段代码摘出来了。

这个就是问题的答案:

  1. 如果是静态方法调用非静态方法:因为调用静态方法时,是没有传入this指针的,所以在静态方法中调用非静态方法,非静态方法的第一个参数,是隐含的,无法传值,所以无法调用。其实你硬要支持也不是不可以做到,会稍微麻烦些,要改动很大机制才行。因为静态方法是所有Java对象共用的。但是如果真的支持了,那区分静态、非静态,就没意义了。
  2. 如果是非静态方法调用静态方法:可以调用。因为调用非静态方法,不需要this指针。其实就算要,也有的给。

GET到了吗?

超预期

如果我来面试,这个问题还没完,我会追问:其他的语言,比如C语言、C++、python、golang,你觉得它们会怎么做?为什么要追问呢?因为你就算回答出来上面的答案,其实也不能让你凸显出来。大概率很多人都能答出来。

如果我追问的,你能主动回答出来,那就非常nice。说明你对技术有立体的认知。但是很多Java Coder的技术是断层的。就是说他们的脑海中只有Java。你需要通过问题引导他思考。

python是怎么做的呢?调用python方法需要手动传this指针。因为不是隐含传参,所以这个问题放在python中问出,可能很容易答出来。

如果是C语言呢?看代码

没报错对不对?这不能说明在C语言中,静态方法能够调用非静态方法。在C语言中,static不是用来定义非静态方法的,是用来限制方法的作用域的。就是说,方法前面加了static修饰,这个方法只能在当前文件中调用。因为C语言是面向过程的语言。这里的方法称为函数更合适。

如果是C++呢?看代码

结果及背后的原理跟Java都是一样的:非静态方法能够调用静态方法,静态方法不能调用非静态方法,因为this指针。

推荐阅读

1、搭建JVM框架,输出hello,world
2、超快速定位OOM一揽子计划
3、JVM的多态是如何实现的
4、Java线程VS操作系统线程

结语

我是子牙老师,一个明明可以靠脸吃饭,却偏偏抢大家饭碗的男人。深入研究JVM、Linux内核、Windows内核,聚焦分享超硬核干货文章。还有,我的创业心得。运营公众号:硬核子牙。我的硬核文章及创业心得都在这里可以看到,目前原创文章已经很多很多啦。

Java中的静态方法为什么不能调用非静态方法相关推荐

  1. java中怎么调用非静态方法有哪些_java中 静态方法和非静态方法的调用

    静态方法里面不能调用非静态方法 package com.zqz.image; public class HellowWord { public void say(String word){// 非静态 ...

  2. Java静态方法调用非静态方法

    静态方法(static mehod)不能直接调用非静态方法(non-static method),可以通过一个对象的引用传入静态方法中,再去调用该对象的非静态方法.在主函数(static方法)中,经常 ...

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

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

  4. static(静态方法中)如何调用非静态方法?

    在静态方法的内部不能直接调用非静态方法,因为方法属于类而不是对象,我们可以通过自己手动new对象来在静态方法中调用 简单case: 如下代码设置Build类一个静态方法一个成员方法 public cl ...

  5. 为什么静态方法无法直接调用非静态成员变量和方法

    静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...

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

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

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

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

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

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

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

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

最新文章

  1. php怎样连接上数据库服务器,php怎样连接数据库
  2. alan turing_深入探讨Alan Turing的生活和遗产:5本及更多书籍
  3. endnote安装_EndNote X8 系列教程(一):软件介绍与安装
  4. 思科智能交换机受多个严重漏洞影响
  5. ubuntu18.04安装mysql8.0
  6. web 使网站在浏览器中全屏显示 fullscreen=yes
  7. 奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其
  8. 《一次与IP MTU、TCP MSS导致SSL协商失败的案例》—那些年踩过的坑(二)
  9. mysql中的comment_请问一下在mysql中的 COMMENT 有什么作用吗??
  10. 计算机组成CPU最佳配置,计算机组成原理--CPU
  11. 如何编程阶梯形c语言,阶梯式C语言程序设计实验指导书.doc
  12. 算法与数据结构 --- 哈夫曼树及其应用
  13. SESSION的窃取
  14. 微信小程序获取用户信息-头像、昵称......
  15. web全栈开发项目搭建整体思路和学习路线
  16. Qt常用却容易忘的功能记录
  17. Python之安装MySQLdb
  18. 关于计算机春联PPT,春节祝福专题-春联.ppt
  19. 1+X云计算运维与开发 项目一(初中级)
  20. 制作画中画特效,把视频嵌到另一个视频画面任意位置

热门文章

  1. 2015年大二上-数据结构-图-1-(4)-利用遍历思想求解图问题(2)
  2. 北大光华管理学院-宏观经济学
  3. 基于元胞自动机的城市规划
  4. 不属于c语言程序运算符,以下选项中不属于C语言程序运算符的是( )
  5. 塞尔达:旷野之息个人对比上古卷轴V:天际
  6. Linux——Ubuntu忘记用户密码的解决及登录root
  7. python基础(##16)
  8. 网络基础:套接字编程,UDP和TCP通信程序
  9. 上网部署(锐捷睿易篇2)
  10. Mp4视频首帧加载时间过长问题分析