教妹学Java:第一个Java程序Hello World
“三妹,今天,我们来编写第一个 Java 程序,Hello World 期待吗?”
三妹点了点头,表示认同(😂)。
“好的,那我们直接开始。”
打开 Intellij IDEA,新建一个学习 Java 的项目,点击 File → New → Project。
选择 JDK 版本,比如之前我们安装的 JDK 8。
你也可以选择 JDK 11 或者最新的 JDK 17 或者添加新的 JDK 版本,但(不建议)。
然后点击「next」,直到填写项目名字,比如说 tobebetterjavaerdemo。
然后点击 finish,之后就可以看到我们新建的项目界面了。
如果你的 Intellij IDEA 主题和二哥不一样,没关系,当然了,如果你也是个有颜值追求的家伙,可以安装 Vuesion Theme 插件,安装方法戳这里。
“OK,到这里,我们已经把学习 Java 的环境准备好了,接下来就可以写第一个 Hello World 程序了。”我自信地对三妹说。
一般我们会把源代码放在 src 目录下(source 的前缀,所以学编程,英语中常用的单词必须得会,不会就去学)。
右键 src 目录,在菜单中依次选择 New → Java Class。
填写 Class 名,也就是类名(不知道类名是啥,后面会讲),注意大小写敏感,然后按下 enter 键。
就会出现这样的代码。
注释是二哥配置好的,你如果没配置可能没有,public class HelloWorld {}
是 Intellij IDEA 帮我们自动生成的。
之后在大括号里面键入 main
等 Intellij IDEA 给出提示后键入 enter 键。
Intellij IDEA 就会帮我们自动生成 main 方法,也就是这段代码。
然后在 main 方法中键入 so
等出现提示后键入 enter 键。
Intellij IDEA 就会帮我们自动添加 System.out.println()
,这是一个向控制台输出的方法(小白先不管它是什么意思,后面会讲)。
接着在 println()
的小括号中键入 "Hello World"
,注意是英文的双引号,中文的会报错哦,三妹。
然后在 HelloWorld.java 的代码编辑器,也就是光标所在的位置右键,选择「Run 'HelloWorld.main()'」。
等 Intellij IDEA 编译&运行后就可以在控制台看到这样的输出内容。
这就表明我们的第一个 Java 代码完成了,恭喜自己一下吧,三妹!
“二哥,你太棒了,好激动哦!!!!!!!”
下面,我们来简单解释一下这段代码。
第一个 Java 程序非常简单,我们来改一下输出内容,把 Hello World 替换掉:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("三妹,少看手机少打游戏,好好学,美美哒。");
}
}
- class 关键字:用于在 Java 中声明一个类。
- public 关键字:一个表示可见性的访问修饰符。
- static 关键字:我们可以用它来声明任何一个方法,被 static 修饰后的方法称之为静态方法。静态方法不需要为其创建对象就能调用。
- void 关键字:表示该方法不返回任何值。
- main 关键字:表示该方法为主方法,也就是程序运行的入口。
main()
方法由 Java 虚拟机执行,配合上 static 关键字后,可以不用创建对象就可以调用,可以节省不少内存空间。 String [] args
:main()
方法的参数,类型为 String 数组,参数名为 args。System.out.println()
:一个 Java 语句,一般情况下是将传递的参数打印到控制台。System 是 java.lang 包中的一个 final 类,该类提供的设施包括标准输入,标准输出和错误输出流等等。out 是 System 类的静态成员字段,类型为 PrintStream,它与主机的标准输出控制台进行映射。println 是 PrintStream 类的一个方法,通过调用 print 方法并添加一个换行符实现的。
“实在记不住也没关系,我们后面还会讲哦(可以跳转的地方都会展开细讲)。”我的话令三妹感到非常开心。
好,接下来再告诉你一点额外的知识点(如果觉得比较难可跳过),三妹。
在 Intellij IDEA 的 terminal 面板中,可以看到对应的 java 源代码文件和编译后的 .class 文件。
可以在对应的文件上右键选择 open in terminal 打开。
可以通过 pwd 命令查看当前包路径,通过 ls 命令查看包路径下面有哪些文件。
class 文件在 target 目录下,classes 为 src/main 目录下的 class 文件;test-classes 为 src/test 目录下的 class 文件。
“二哥,.class 文件和 .java 源代码,它们之间的关系是什么样的呢?”三妹还是挺喜欢学习的嘛,发现的问题都很关键。
“不错不错,都能挖掘到这个点了。”
.java 是源代码,也就是我们开发人员可以看懂的,可以编写的;.class 是字节码文件,是经过 javac 编译后的文件,是交给 JVM 执行的文件。
“三妹,这里再顺带给你讲一下,Java 是编译型语言还是解释型语言。”
“好啊,我正要问这个‘编译’到底是怎么回事呢?”
Java 的第一道工序是通过 javac 命令把 Java 源码编译成字节码。
比如说我们可以主动执行 javac Hello.java
命令将源代码文件编译为 Hello.class 文件(用 Intellij IDEA 的话,并不需要我们主动去编译「javac」,直接运行就可以自动生成 .class 文件)。
之后,我们可以通过 java 命令运行字节码(比如说 java Hello
),此时就有 2 种处理方式了。
- 1、字节码由 JVM 逐条解释执行。
- 2、部分字节码可能由 JIT(即时编译,戳链接了解)编译为机器指令直接执行。
①、逐条解释执行:
逐条解释执行是 Java 虚拟机的基本执行模式。在这种模式下,Java 虚拟机会逐条读取字节码文件中的指令,并将其解释为对应的底层操作。解释执行的优点是实现简单,启动速度较快,但由于每次执行都需要对字节码进行解释,因此执行效率相对较低。
总结一下逐条解释执行的特点:
- 实现简单
- 启动速度较快
- 执行效率较低
②、JIT 即时编译:
为了提高 Java 程序的执行效率,Java 虚拟机引入了即时编译(JIT,Just-In-Time Compilation)技术。在 JIT 模式下,Java 虚拟机会在运行时将频繁执行的字节码编译为本地机器码,这样就可以直接在硬件上运行,而不需要再次解释。这样做的结果是显著提高了程序的执行速度。需要注意的是,JIT 编译器并不会编译所有的字节码,而是根据一定的策略,仅编译被频繁调用的代码段(热点代码)。
总结一下 JIT 即时编译的特点:
- 提高执行效率
- 编译热点代码
- 动态优化
实际上,现代 Java 虚拟机(如 HotSpot)通常会结合这两种执行方式,即解释执行和 JIT 即时编译。在程序运行初期,Java 虚拟机会采用解释执行,以减少启动时间。随着程序的运行,Java 虚拟机会识别出热点代码并使用 JIT 编译器将其编译为本地机器码,从而提高程序的执行效率。这种结合策略称为混合模式。
也就是说,为了跨平台,Java 源代码首先会编译成字节码,字节码不是机器语言,需要 JVM 来解释。
有了 JVM 这个中间层,Java 的运行效率就没有直接把源代码编译为机器码来得效率更高,这个应该能理解吗,多了中间商嘛。所以为了提高效率,JVM 引入了 JIT 编译器,把一些经常执行的字节码直接搞成机器码。
所以,Java 是解释和编译并存。但通常来说,我们会说“Java 是编译型语言”,尽管这样并不准确,主要是 JIT 是后面才出现的,“先入为主嘛”。
“好的,二哥,我了解了。”
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。