Java中的静态方法为什么不能调用非静态方法
hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师。
昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题,我听完后觉得还挺有意思的,分享给大家
小佬们先别急着看我的分析,先自己想想答案
你是不是想说
因为静态方法是属于类的,而非静态方法属于实例对象
哈,有人这样回答了,勇哥表示不满意。你这样回答,离正确答案,就差那么一句话。说出来了,就表示你知道了。哪句话呢?
临门一脚
JVM是如何调用Java方法的呢?咱们不把call_stub、entry_point、执行流扯进来,伪代码大概是这样
构建运行环境->调用Java方法
构建运行环境做什么呢?比如是否需要触发类初始化、通过符号引用找到method对象,将method对象这个直接引用进行缓存、创建栈帧、拷贝参数……
不管是非静态方法,还是静态方法,JVM都是按这个流程进行调用。区别就在于构建运行环境这里。如果调用的是非静态方法,构建运行环境会多做一步:给this指针赋值。为了帮助大家理解这段话,我从我手写的JVM中把这段代码摘出来了。
这个就是问题的答案:
- 如果是静态方法调用非静态方法:因为调用静态方法时,是没有传入this指针的,所以在静态方法中调用非静态方法,非静态方法的第一个参数,是隐含的,无法传值,所以无法调用。其实你硬要支持也不是不可以做到,会稍微麻烦些,要改动很大机制才行。因为静态方法是所有Java对象共用的。但是如果真的支持了,那区分静态、非静态,就没意义了。
- 如果是非静态方法调用静态方法:可以调用。因为调用非静态方法,不需要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中的静态方法为什么不能调用非静态方法相关推荐
- java中怎么调用非静态方法有哪些_java中 静态方法和非静态方法的调用
静态方法里面不能调用非静态方法 package com.zqz.image; public class HellowWord { public void say(String word){// 非静态 ...
- Java静态方法调用非静态方法
静态方法(static mehod)不能直接调用非静态方法(non-static method),可以通过一个对象的引用传入静态方法中,再去调用该对象的非静态方法.在主函数(static方法)中,经常 ...
- php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...
- static(静态方法中)如何调用非静态方法?
在静态方法的内部不能直接调用非静态方法,因为方法属于类而不是对象,我们可以通过自己手动new对象来在静态方法中调用 简单case: 如下代码设置Build类一个静态方法一个成员方法 public cl ...
- 为什么静态方法无法直接调用非静态成员变量和方法
静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...
- 静态方法不能调用非静态方法的原因
静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序 ...
- java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...
这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...
- java 静态调用非静态方法_java中静态方法中调用非静态方法的详解
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...
- java中静态方法中调用非静态方法的详解
静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...
最新文章
- php怎样连接上数据库服务器,php怎样连接数据库
- alan turing_深入探讨Alan Turing的生活和遗产:5本及更多书籍
- endnote安装_EndNote X8 系列教程(一):软件介绍与安装
- 思科智能交换机受多个严重漏洞影响
- ubuntu18.04安装mysql8.0
- web 使网站在浏览器中全屏显示 fullscreen=yes
- 奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其
- 《一次与IP MTU、TCP MSS导致SSL协商失败的案例》—那些年踩过的坑(二)
- mysql中的comment_请问一下在mysql中的 COMMENT 有什么作用吗??
- 计算机组成CPU最佳配置,计算机组成原理--CPU
- 如何编程阶梯形c语言,阶梯式C语言程序设计实验指导书.doc
- 算法与数据结构 --- 哈夫曼树及其应用
- SESSION的窃取
- 微信小程序获取用户信息-头像、昵称......
- web全栈开发项目搭建整体思路和学习路线
- Qt常用却容易忘的功能记录
- Python之安装MySQLdb
- 关于计算机春联PPT,春节祝福专题-春联.ppt
- 1+X云计算运维与开发 项目一(初中级)
- 制作画中画特效,把视频嵌到另一个视频画面任意位置