面试官:说一说你的第一个Java程序是怎么跑起来的
面试官:“说一说你第一个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程序是怎么跑起来的的更多相关文章
- 这道面试必问的JVM面试题70%的Java程序员会做错
前言 聊聊JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别. JVM可以说和我们是老朋友了 ...
- 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?
GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...
- 面试官:小伙子,给我说一下Java 数组吧
Java 数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.声明数组变量 首先必须声明数组变量,才能在程序中使用数组. dataType[] arrayRefVar; // 首选的 ...
- 《JAVA 程序员面试宝典(第四版)》之JAVA程序设计基础概念(1)类型转换
问题主题:类型转换 书页号码:37页 题目: 讨论点:答案不是D,应该是B 理由:看下面在编译器输入的结果 知识扩展:装箱与拆箱, == 与 equals 区别 之前也老是听说什么装箱.拆箱之 ...
- 面试官问,说一个你在工作非常有价值的bug
如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...
- 谷歌PM面试官告诉你,如何成功拿到理想offer
快来看看大咖Nick如何甄选人才~文章转自墨刀公众号. 本文作者: Nick Baum,目前在谷歌做PM 作为谷歌的产品经理和面试官,我已经面过几百个PM的候选人了吧.这些经历能让我分享一下在PM求职 ...
- 引用面试官文章 :如何准备Java初级和高级的技术面试
本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...
- 我以为我对Mysql索引很了解,直到我遇到了阿里的面试官
GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的 ...
- 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!
最近,小黑哥的一个朋友出去面试,回来跟小黑哥抱怨,面试官不按套路出牌,直接打乱了他的节奏. 事情是这样的,前面面试问了几个 Java 的相关问题,我朋友回答还不错,接下来面试官就问了一句:看来 Jav ...
- 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!
程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来. 楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...
随机推荐
- Go 函数的健壮性、panic异常处理、defer 机制
Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...
- slice简介
简介 Go语言中的切片(slice)是一种灵活的数据结构,它构建在数组之上并提供了方便的方式来操作数组的一部分.切片的底层实现涉及到数组和一些元数据.以下是Golang切片的底层实现的详细介绍: 底层 ...
- 文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题
二.用go语言,对一组同构对象用单数组表示法实现,写出过程ALLOCATE-OBJECT和FREE-OBJECT. 文心一言: 在Go语言中,我们通常使用指针和结构体来表示和操作复杂的数据结构.对于一 ...
- c#使用正则表达式匹配提取日期
string target_p ="2021/09/18"; string target_q ="2021-09-18"; 格式yyyy/MM/dd: Matc ...
- Python 利用pymysql和openpyxl操作MySQL数据库并插入Excel数据
1. 需求分析 本文将介绍如何使用Python连接MySQL数据库,并从Excel文件中读取数据,将其插入到MySQL数据库中. 2. 环境准备 在开始本文之前,请确保您已经安装好了以下环境: Pyt ...
- 全网最详细4W字Flink全面解析与实践(下)
本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 承接上篇未完待续的话题,我们一起继续Flink的深入探讨 Flink S ...
- atest
#include<iostream> using namespace std; int main() { reutrn 0; }
- 最佳实践-使用Github Actions来构建跨平台容器镜像
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 最近在写K8s的相关系列文章,因为有涉及到镜像构建,发现在Mac m1的Arm架构下构建的部分镜像,没法在X86架构 ...
- Net 高级调试之十:轻量级代码生成的调试
一.简介 今天是<Net 高级调试>的第十篇文章.说起来,高级调试,调试的内容还是挺多的,技巧也不少,但是,要想做一个合格的高级调试人员,还需要掌握如何调试动态生成的IL代码.今天要探讨的 ...
- 【Android】打卡app 今日完成情况记录
已完成内容:页面的设计.数据库的建立 今日目标:实现数据库的增删改查,并能够在页面实现输出 逻辑: 1.用户进入注册页面,进行注册,注册成功后,可以成功登录(这一阶段就完成了) 2.登录后,显示用户的 ...