【JVM面试题】Java中的静态方法为什么不能调用非静态方法

昨晚京东大佬勇哥在群里分享了一道他新创的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指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最优化理论期末复习笔记 Part 2

数学基础线性代数 从行的角度从列的角度行列式的几何解释向量范数和矩阵范数 向量范数矩阵范数的更强的性质的意义 几种向量范数诱导的矩阵范数 1 范数诱导的矩阵范数无穷范数诱导的矩阵范数2 范数诱导的矩阵范数 各种范数之间的等价性向量与矩阵序列的收敛性 函数的可微性与展…

【Delphi 基础知识 10】class operator重载运算符的使用

在Delphi中,class operator 是一种用于重载类运算符的语法。通过使用 class operator,你可以为你的Record记录类型中自定义运算符,使得Record能够像内置类型一样支持各种运算符操作。这使得你可以更灵活地定义类的行为,使其更符合…

mysql in 走不走索引

当只有一个值的时候,是ref当小范围的时候,是range当数据过多时,索引有可能失效(数量是全表30%时)

2_并发编程同步锁(synchronized)

并发编程带来的安全性同步锁(synchronized) 1.他的背景 当多个线程同时访问,公共共享资源的时候,这时候就会出现线程安全,代码如: public class AtomicDemo {int i0;//排他锁、互斥锁public void incr(){ //synchronizedi; …

pip install 安装模块包位置及设置Anaconda为默认版本python

01问题 pycharm运行代码找不到模块包pip install不知道安装到哪里了jupyter使用不同版本python 02产生原因 安装了多个版本pythonanaconda本身也带有python 03解决办法 (1)查看当前默认python版本 打开运行窗口Winr; 输入cmd回车; 输入python回车…

中小学班主任工作指南

作为中小学的班主任,我们的工作既繁重又重要。这份工作指南旨在为各位班主任提供一些实用的建议,帮助大家更好地完成教育教学任务,促进学生的全面发展。 一、了解学生是关键 首先,我们要深入了解每一个学生。了解他们的个性、兴趣…

Linux第2步_创建虚拟机

VMware软件安装好后,就可以创建虚拟机了。 一、虚拟机对CPU的要求较高 i7 处理器:CPU:Intel(R) Core(TM) i7-8700 CPU 3.20GHz 3.19 GHz 内核数:6 线程数: 12 最大睿频频率: 4.60 GHz 英特尔 睿…

vue3 vuedraggable draggable element must have an item slot

vue3vite 看官网使用这种<template #item“{ element }”> <draggablev-model"myArray"start"onStart"end"onEnd":sort"false"item-key"id"draggable".item"handle".mover" ><template…

LinkedIn 开源其开发人员工作效率与幸福感衡量框架

回望2023年&#xff0c;在整个开发生态系统中&#xff0c;推动新工具和新技术发展的主要因素有两个&#xff1a;一个是人工智能&#xff0c;包括使用和构建人工智能&#xff0c;另一个是提高开发人员的工作效率。 后者可能是最难量化和描述的。首先&#xff0c;开发人员的生产效…

游戏录屏软件哪个好用免费?我来告诉你!

在游戏玩家的世界里&#xff0c;录制并分享游戏精彩瞬间是一种常见的需求。选择一款好用且免费的游戏录屏软件对于实现这一目标至关重要。可是游戏录屏软件哪个好用免费呢&#xff1f;本文将介绍两款备受好评的免费游戏录屏软件。通过详细的步骤介绍&#xff0c;帮助你轻松记录…

深信服技术认证“SCCA-C”划重点:云计算关键技术

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…

springboot使用@ConfigurationProperties自动绑定配置参数属性

ConfigurationProperties使用 ConfigurationProperties是 springboot提供用于将配置文件中的属性值映射到 Java bean对象上。通过使用该注解&#xff0c;我们可以方便地将属性文件中的值绑定到一个实例化的类对象上&#xff0c;从而方便地在应用程序中使用这些属性。 Configu…

无缝衔接,完美对接:探索系统对接的最佳实践

目录 1、前言 2、系统对接概述 2.1 什么是系统对接 2.2 系统对接的重要性 3、系统对接注意事项 4、系统对接的最佳实践 5、系统对接的风险和解决方案 5.1 数据安全风险 5.2 兼容性风险 5.3 故障和错误处理 6、结语 1、前言 随着科技的不断进步和应用场景的不断拓展…

Python 自学(四) 之元组字典与集合

目录 1. 列表&#xff0c;元组&#xff0c;字典与集合的区别 2. 元组的创建和删除 tuple() del P101 3. 单个元素的元组 P102 4. 元组元素的修改 P106 5. 元组的使用场景 6. 字典的创建和删除 dict() zip() : del clear() P1…

使用setcap修改Linux程序CAP能力值

Linux是一种安全操作系统&#xff0c;它给普通用户尽可能低的权限&#xff0c;而把全部的系统权限赋予一个单一的帐户--root。root帐户用来管理系统、安装软件、管理帐户、运行某些服务、安装/卸载文件系统、管理用户、安装软件等。另外&#xff0c;普通用户的很多操作也需要ro…

Transformer 架构解释

一、说明 变形金刚是机器学习的一个新发展&#xff0c;最近引起了很大的轰动。他们非常善于跟踪上下文&#xff0c;这就是为什么他们写的文本有意义。在本章中&#xff0c;我们将介绍它们的体系结构以及它们的工作原理。 amanatulla1606 Transformer 模型是机器学习中最令人兴奋…

点击出现视频弹框

<VideoPlayer ref"video":size"{ width: 88%, height: 100% }" :videoSrc"currentVideo.url"></VideoPlayer>import VideoPlayer from /components/video-player.vue

Cad怎么绘制齿轮模型?

CAD怎么绘制齿轮模型&#xff1f;cad中想要绘制一个锯齿形状&#xff0c;该怎么绘制呢&#xff1f;学会cad怎么画齿轮是必不可少的&#xff0c;下面我们就来看看使用cad齿轮的画法。 1、cad齿轮画法很简单&#xff0c;首先打开cad正交模式&#xff0c;并打开cad的圆心捕捉、最…

java String输出GB2312编码格式到文件

import java.io.*;public class GB2312Output {public static void main(String[] args) {try {// 创建文件输出流FileOutputStream fos new FileOutputStream("output.txt");// 创建GB2312编码的输出流写入器OutputStreamWriter osw new OutputStreamWriter(fos, …

护眼台灯值得买吗?如何选购护眼台灯?2024年护眼台灯排行榜

作为在护眼行业摸爬滚打几年的好老司机&#xff0c;我对护眼台灯产品自然不陌生&#xff0c;护眼台灯也是很早之前就在使用&#xff0c;对于它的技术参数、原理、功能等可以说是非常熟悉。 现在护眼台灯普遍出现在孩子们的书桌上&#xff0c;在孩子深夜学习时&#xff0c;挑起…