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

我:“啊,您是说Hello World吗?”

面试官:“嗯,没错,几十年过去了,还是hello world......”

我:“好滴!且听俺给您唠一唠”

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

/**
* 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 是一种解释型语言。

面试官:说一说你的第一个Java程序是怎么跑起来的的更多相关文章

  1. 这道面试必问的JVM面试题70%的Java程序员会做错

    前言 聊聊JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别. JVM可以说和我们是老朋友了 ...

  2. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...

  3. 面试官:小伙子,给我说一下Java 数组吧

    Java 数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.声明数组变量 首先必须声明数组变量,才能在程序中使用数组. dataType[] arrayRefVar; // 首选的 ...

  4. 《JAVA 程序员面试宝典(第四版)》之JAVA程序设计基础概念(1)类型转换

      问题主题:类型转换   书页号码:37页 题目: 讨论点:答案不是D,应该是B 理由:看下面在编译器输入的结果 知识扩展:装箱与拆箱, == 与 equals 区别 之前也老是听说什么装箱.拆箱之 ...

  5. 面试官问,说一个你在工作非常有价值的bug

    如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...

  6. 谷歌PM面试官告诉你,如何成功拿到理想offer

    快来看看大咖Nick如何甄选人才~文章转自墨刀公众号. 本文作者: Nick Baum,目前在谷歌做PM 作为谷歌的产品经理和面试官,我已经面过几百个PM的候选人了吧.这些经历能让我分享一下在PM求职 ...

  7. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  8. 我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

    GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的 ...

  9. 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!

    最近,小黑哥的一个朋友出去面试,回来跟小黑哥抱怨,面试官不按套路出牌,直接打乱了他的节奏. 事情是这样的,前面面试问了几个 Java 的相关问题,我朋友回答还不错,接下来面试官就问了一句:看来 Jav ...

  10. 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!

    程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来.   楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...

随机推荐

  1. Strimzi Kafka Bridge(桥接)实战之二:生产和发送消息

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Strimzi Kafka B ...

  2. 若依框架的startPage( )函数怎么自动关联查询SQL语句?

    Question Description 使用JAVA语言的若依框架的时候,发现只要使用了startPage()函数, 并不需要前端传递分页的数据,也不需要注解,就能完成分页功能.预判他应该是使用类似 ...

  3. 什么???CSS也能原子化!

    1.什么是原子化 CSS? Atomic CSS is the approach to CSS architecture that favors small, single-purpose class ...

  4. 配置虚拟主机-部署nginx代理并验证缓存生效

    1.虚拟主机的配置: 虚拟主机的作用: 虚拟主机提供了同一台服务器上运行多个网站的功能. 虚拟主机的三种模式:   1)基于域名配置虚拟主机是最常见的一种虚拟主机配置. 只需配置你的DNS服务器,将每 ...

  5. Linux g++减小可执行文件大小

    去掉参数-g,产生不带有调试信息的可执行文件 加上参数-O2,产生尽可能小和尽可能快的代码 strip 可执行文件 去掉目标文件中的一些符号表.调试符号表信息,以减小程序的大小 参考文献: g++重要 ...

  6. java学习内容-1

    java学习内容-1 (一)jdk的使用 (二)定义标识符的规则 (三)java常用类 1.String类 2.Math类 3.Integer和Double类 4.输出 5.Scanner类 例子 ( ...

  7. 「译文」Google SRE 二十年的经验教训

    ️URL: https://sre.google/resources/practices-and-processes/twenty-years-of-sre-lessons-learned/ ✍️Au ...

  8. Vue源码学习(十五):diff算法(二)交叉比对(双指针)

    好家伙, 本节来解决我们上一章留下来的问题, 新旧节点同时有儿子的情况本章继续解决 1.要做什么? 本章将解决, 1.在相同tag下子元素的替换问题 2.使用双指针进行元素替换, 实现效果如下:   ...

  9. 创造力的起源《The Origins of Creativity》

    接近创造力 创造力是对原创的追求,其动力是人类对于新奇事物的钟爱. 了解创造力需要三个层次的思考. 1.What(如何定义这种现象) 2.Question(发问,他是如何出现的,导致其出现的最初原因是 ...

  10. 将ECharts图表插入到Word文档中

    @ 目录 在后端调用JS代码 准备ECharts库 生成Word文档 项目地址 库封装 本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图 ...