面试官:“说一说你第一个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. CefSharp自定义滚动条样式

    在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一.本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式. 基本思路 在前端开 ...

  2. PPT太大发不出去?教你三个PPT压缩方法,200M的PPT变15M

    相信有很多小伙伴在工作的时候,都会制作不少的PPT,而我们也知道很多PPT在制作完成以后,体积就会变得非常大,在发送给别人的时候总是会受到限制,是有点难搞了. 别担心,今天小编将告诉大家三个简单的方法 ...

  3. Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行

    Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行 solr 远程命令执行 (CVE-2019-17558) 漏洞简介 Apache Velocity是一 ...

  4. TopCoder 15903 EllysNim

    TopCoder 15903 EllysNim(https://vjudge.net/problem/TopCoder-15903) \(n\)看似有点东西,实际上就只是一个贪心... 设\(i\)表 ...

  5. 快速掌握keepalived

    转载请注明出处: Keepalived是一个基于VRRP(虚拟路由冗余协议)的开源软件,用于在Linux系统上实现高可用性和负载均衡.它的主要功能是通过多台服务器之间的协作,确保在其中一台服务器发生故 ...

  6. List、Set与 Map

    目录 1. List接口和常用方法 1.1 List接口基本介绍 1.2 List接口的三种遍历方式 2. ArrayList 2.1 注意事项 2.2 ArrayList的底层操作机制源码分析(重点 ...

  7. 研读Java代码必须掌握的Eclipse快捷键

    1. Ctrl+左键 和F3 这个是大多数人经常用到的,用来查看变量.方法.类的定义 跳到光标所在标识符的定义代码.当按执行流程阅读时,F3实现了大部分导航动作. 2 Ctrl+Shift+G 在工作 ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题

    四.用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大.请给出在大数组上实现 ...

  9. RLHF · PBRL | RUNE:鼓励 agent 探索 reward model 更不确定的 (s,a)

    论文题目: Reward uncertainty for exploration in preference-based reinforcement learning,是 ICLR 2022 的文章, ...

  10. Java基础知识(纯干货)

    基础篇 IDEA 开发 Java项目 卸载JDK 删除Java的安装目录 删除JAVA_HOME 删除path下关于java的目录 java -version 安装JDK17 下载链接:https:/ ...