面试官:说一说你的第一个Java程序是怎么跑起来的?

面试官:"说一说你第一个Java程序是怎么跑起来的?" 我:"啊,您是说Hello World吗?" 面试官:"嗯,没错,几十年过去了,还是hello world......" 我:"好滴!且听俺给您唠一唠"

话不多说,直接上一段代码:

java 复制代码
/**
 * class 关键字:用于在 Java 中声明一个类
 */
public class StaffApplicationTests {
    /**
     * public 关键字:一个表示可见性的访问修饰符
     * static 关键字:我们可以用它来声明任何一个方法,被 static 修饰后的方法称之为静态方法。
     * void 关键字:表示该方法无返回值。
     * main 关键字:表示该方法为主方法,也就是程序运行的入口。main() 方法由 Java 虚拟机执行,配合上 static 关键字后,可以不用创建对象就可以调用。
     * String [] args:main() 方法的参数,类型为 String 数组,参数名为 args。
     * @param args
     */
    public static void main(String[] args) {
        //System.out.println():一个 Java 语句,一般情况下是将传递的参数打印到控制台。
        System.out.println("welcome to java world");
    }
}

这就是Java中最简单,也是大部分同学在刚接触Java时看到的第一个程序代码,运行结果就是在编译器(IDEA)的控制台打印出"welcome to java world": 那么开头面试官的问题,回答到这里就算完了吗?当然不是!很明显面试官想要不止如此。 整个java程序,从编写的java文件到展出的结果,可以画一个流程图,根据流程图向面试官展开回答 第一步:通过javac命令调用java编译器,将上述的代码编译成.class字节码文件(命令:javac HelloWorld.java); 第二步:通过java命令调用jvm解释器,将第一步生成的字节码文件解释成机器可以识别的机器码(命令:java HelloWorld),而字节码文件是面向JVM的,而不是面向操作系统的,故我们只要选则对应系统(windows、MacOS、Linux)的Java虚拟机,就可以实现跨平台运行Java代码;

第三步:机器识别机器码,响应结果。

讲到这里面试官可能会紧跟着追问:"每次都需要解释器将字节码解释成机器码,如果代码复杂性很高,岂不是效率很低?"

这时候你就可以淡淡的回一句:"我知道你很急,但请你先别急,俺还没讲完呢,嘿嘿",虽然好贱,但面试官肯定被你逗笑啦!

作为编程语言的常青树,Java自然不会如此低效,为了解决单方面的解释过慢问题,Java引入了 JIT(Just in Time Compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。如现在常用的HotSpot就采用了解释执行和JIT即时编译相结合的方式,根据二八定律分配资源,也就是说代码执行的次数越多,速度越快。

嗑唠到这里,就又延伸出了一个考点:"Java是编译型还是解释型语言?"

其实从上面的内容我们已经可以推测答案了,但这里还是想多说几句,编程语言之所以分编译型和解释型是因为计算机并不能直接识别我们所写的任何一种语言的代码(Java,c,c++,python,php,Rust,Go等等),在计算机的世界里只有0和1,那么为了让计算机可以理解我们的代码,就需要翻译,翻译的两种方式:编译与解释。 编译型: 通过编译器将源代码一次性编译成机器码,执行速度很快,但开发效率低,常见的编译性语言有 C、C++、Go、Rust 等等。 解释型: 通过解释器将代码逐句解释为机器码后再运行,开发效率高,执行速度慢,常见的解释性语言有 Python、JavaScript、PHP 等等。

Java 是一种兼具编译和解释特性的语言,.java 文件会被编译成与平台无关的 .class 文件,但是 .class 字节码文件无法被计算机直接执行,仍然需要 JVM 进行翻译成机器语言。所以严格意义上来说,Java 是一种解释型语言。

相关推荐
坐吃山猪11 分钟前
JDK 8 到 JDK 21 新特性知识要点
java·开发语言·windows
坐吃山猪13 分钟前
【多线程】FutureTask多线程底层实现
java·开发语言·数据库
weixin1997010801617 分钟前
[特殊字符]《从0到1:闲鱼开放平台授权登录 + AccessToken 刷新 + 聚石塔部署完整链路》(附Python源码)
java·数据库·python
Freak嵌入式35 分钟前
RP2040 PIO 编程模型与状态机原理:从硬件架构到工作逻辑全解析
java·大数据·开发语言·单片机·嵌入式硬件·硬件架构
kakawzw41 分钟前
Netty源码笔记
java·服务器·后端
zhuodedao1 小时前
Spring AI + MCP 文件工具未调用问题复盘:为什么初始化成功却没有写入文件?
java·debug·agent·springai·mcp
Java小白笔记1 小时前
Java中大数据实时归集与指标汇总方案
java·大数据·开发语言
随遇而安zx1 小时前
【地基篇】---Java 8 JVM 知识大纲
java·开发语言·jvm
雾隐隐o1 小时前
Docker 镜像归档与容器管理
java·docker·eureka
Meta391 小时前
Java八股文之Spring Boot 中解决 MySQL 和 Elasticsearch (ES) 的数据一致性问题
java·spring boot·mysql