文章目录
- 一. Java 简介
- 1. JVM
- 2. JRE
- 3. JDK
- 二. 安装 JDK
- 1. 下载和安装
- 2. 配置 Path
- 3. 配置 JAVA_HOME(选讲)
- 优化
- 三. 入门案例
- 1. 第一行代码
- 1) jshell
- 2) 代码解读
- 总结
- 3) 为何要分成对象与方法
- 2. 第一份源码
- 1) 源码结构
- 2) 编写 java 源代码
- 3) 编译 java 源代码
- 4) 运行 class 字节码
- 3. cmd命令行运行Java文件产生乱码问题的解决方式
- 中文输出乱码
- 解决方法1
- 解决方法2
- 编译错误
- 4. 注释
- 单行注释
- 多行注释
- 文档注释
- 5. 思考-为何需要字节码
- C++ 的翻译过程
- Java 的翻译过程
- 小结
- 四. IDE 工具
- 1. 常见 IDE 工具
- Eclipse
- Vscode
- IntelliJ IDEA
- 2. IntelliJ IDEA 的配置及使用
- 1) 安装启动
- 2) 创建项目
- 3) 运行代码
- 五. 实用工具
- 1. Ubuntu 子系统
- 1) 安装 wsl 工具
- 2) 安装 Ubuntu 子系统
- 3) 运行 Ubuntu 子系统
- 2. 终端工具
- 3. 截图工具
- 4. 笔记工具
- 5. 思维导图工具
一. Java 简介
Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今,Java 仍是企业和开发人员的首选开发平台,全球有数百万开发人员运行超过 51 亿台 Java 虚拟机。
1. JVM
- 它是 Java Virtual Machine 也就是 Java 虚拟机的缩写,它的职责是解释执行Java代码。我们写好的 Java 代码,并不能被直接运行,而是需要交给 JVM 来解释执行
- 很多公司都提供了 JVM 实现,最为知名的是 Oracle 提供的 JVM 实现
2. JRE
- JRE呢,是 Java runtime environment 的缩写,含义是 Java 的运行环境。Java 代码编写好了以后,不仅是需要 JVM 对它来进行解释,而且也需要一些基础功能的配合,这些基础功能呢,称之为核心类库(Core libraries),JVM 和核心类库加在一起,就构成了 JRE 这个运行环境
3. JDK
- JDK是 Java development kit 的缩写,含义是 Java 的开发环境。如果你不仅仅要运行 Java 程序,还想开发新的 Java 程序,那还需要借助一些开发工具,JRE 跟开发工具合在一起,就构成了JDK
通过刚才的讲解,我们了解到 JVM、JRE、JDK 之间是一个包含的关系:
- JDK 功能最全,包含了 JRE 和开发工具
- 其次是 JRE,包含了 JVM + 核心类库
- 最后是 JVM,负责解释执行我们的 Java 代码
因此,对于后面的学习,我们只需要下载安装 JDK 就可以进行 Java 开发了
从 Java 11 这个版本开始,不再单独提供 JRE
- In this release, the JRE or Server JRE is no longer offered. Only the JDK is offered. Users can use
jlink
to create smaller custom runtimes.
二. 安装 JDK
1. 下载和安装
这里介绍 Windows 10 平台下 Oracle 的 JDK 安装
入口在哪儿?访问 oracle 官网 Oracle | Cloud Applications and Cloud Platform
点击 Java 后进入下面的页面
下载页面让我们选择版本,这里选择 Java 17,因为它是长期支持版(LTS)
- 18 虽然看着新,但实际上到 2022.9 就会被 19 取代
- 而 17 的支持会到 2024 年
接下来选择平台,这里选择 Windows,其它平台下 JDK 的安装,请关注我们后续的视频
Windows 有三个版本,第一个是解压版,后两个是安装版。初学者我建议下载解压版(有助于理解 java 程序的查找过程)
下载完毕后,解压到一个没有中文和空格的目录即可
2. 配置 Path
你可以选择一个喜欢的目录,我的解压目录是 d 盘根目录下,如图所示
- 其中 bin 目录下包含的就是它所带的一些开发和运行工具
- 像 Javac.exe 还有 Java.exe 都是较为重要的,后面都会用到
验证安装是否成功:按快捷键 Win + r
,输入命令提示符程序名称 cmd
出现命令提示符窗口,输入 java -version
C:\Users\Lenovo>java
'java' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
这是因为 cmd 程序并不知道 java 的安装位置,因此没有找到它
-
可以输入它的全路径来找到它
- 比如,我的 java 解压到了 D:\jdk-17.0.3.1 这个目录,这时全路径就是 D:\jdk-17.0.3.1\bin\java
- 但显然这么做比较麻烦
-
更好的方式是配置 Path【环境变量】
按快捷键 win
搜索【此电脑】,出现下面的界面
点击【属性】,找到【高级系统设置】
按下图箭头顺序找到新建,把刚才 jdk 的解压目录 + bin 补充填入,我这里是 D:\jdk-17.0.3.1\bin,全部确定。
Path 环境变量的作用:
- Path 环境变量中记录的是程序执行时的搜索路径
- cmd 执行一个程序时,即使未给出完整路径,也会在 Path 环境变量列出的目录下依次查找该程序
- 找到了,则执行
- 都找不到,才报错
- 因此对刚才的问题,只需将 java 程序的所在目录补充进 Path 环境变量
环境变量改动后,原有的 cmd 窗口是不受影响的,要想生效必须打开一个新的 cmd 窗口,输入 java -version
,如果出现类似于下面的输出,表示成功
C:\Users\Lenovo>java -version
java version "17.0.2" 2022-01-18 LTS
Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)
3. 配置 JAVA_HOME(选讲)
网上的一些教程,都会让大家配置另一个叫做 JAVA_HOME 的环境变量,代表的是 JDK 的安装根目录。
- 其实这个环境变量你可以不配,对于后续学习几乎没有影响
- 例外情况是,有的 java 程序,例如后面学到的 Tomcat 在启动时,会用到 JAVA_HOME 环境变量,但这属于个别现象,等我们学到它时再解决不迟
- 还有一个不配 JAVA_HOME 的理由:如果将来有不同的应用运行需要版本的 JDK,这时还不如不配全局 JAVA_HOME,让每个程序在启动脚本里指定自己需要的 JAVA_HOME
出于知识的完整性,我们演示一下如何配置 JAVA_HOME,还是找到环境变量的配置窗口,在系统环境变量处点击新建,输入变量名和变量值,JAVA_HOME 名称是固定的,注意全大写,值是 JDK 的安装根目录,我这里是 D:\jdk-17.0.3.1
优化
配完之后,发现 PATH 环境变量中的 D:\jdk-17.0.3.1\bin 与 JAVA_HOME 中的 D:\jdk-17.0.3.1 有一部分重复了,这样的问题是如果将来切换 jdk 版本,如果改了一处,忘记改另一处,就会造成不一致。
可以把 PATH 的取值修改为 %JAVA_HOME%\bin,其中 %JAVA_HOME% 代表引用 JAVA_HOME 环境变量的值,这样以后改动时,只需要改 JAVA_HOME 这一处就可以了
三. 入门案例
这节课我们来学习 Java 的第一个入门程序,Hello world,目标是命令 jvm,在程序窗口输出一行问候语。
1. 第一行代码
1) jshell
首先用到的是一个名为 jshell 的开发工具,打开命令提示符 cmd,输入 jshell
PS D:\> jshell
| 欢迎使用 JShell -- 版本 17.0.2
| 要大致了解该版本, 请键入: /help intro
jshell>
可以看到【jshell>】后的光标在不断闪烁,表示可以继续在【jshell>】后键入命令或代码
常见命令
- /help 帮助信息
- /exit 退出 jshell
第一行代码来了:输入 System.out.println("Hello, world")
,要注意大小写和引号,查看效果
2) 代码解读
下面来解释这行代码的意思
- 它的整体效果是命令 JVM,给我在在程序窗口输出一行话,话的内容是:
Hello, world
再来把代码拆解,看看每一部分的意思
-
先要说明的是,咱们这个程序窗口内有两个较为抽象的组成部分,输出和输入
-
其中输出的专业叫法是【标准输出】,用来将运算结果展现给用户,代码里就对应着 System.out
-
另一个是【标准输入】,用来接受用户输入的数据,代码里用 System.in 表示,后面再讲
-
System.out 、System.in 代表的这种计算机中的虚拟物体,以后统称之为【对象】
-
System.out 这个对象是 java 为我们提前准备好的
-
以后还有一些对象是需要我们自己创建的,后面会逐渐讲到
-
但是光是拿到 System.out 对象,它并不会显示 Hello, world,我们必须给它下命令,也就是调用对象的功能
- println() 代表的是 System.out 中的一种功能,以后称之为【方法】
- 方法的特征是在使用时会带有一对 ()
- 不同的方法作用不同,println 方法的作用是将 () 内的内容展现到程序窗口并换行,System.out 对象还有 print 方法,区别是不换行输出内容
- 前面的点,表示一种从属关系
- 即 println() 方法从属于 System.out 对象,print 方法也从属于 System.out 对象
- 从属关系决定了对象能否使用此方法,像 System.in 与 println 方法之间没有这种从属关系,就意味着 System.in 对象无法使用此 println 方法
- 想知道对象和哪些方法之间有从属关系,后面会给大家讲解怎么查,目前了解这些足够了
- () 里面的
"hello, world"
叫做方法参数,你可以替换它为其它问候语- 不同的方法需要的参数个数及格式也有所不同,刚才我们用的这个 println 方法只接收了一个参数,以后大家可能见到不同个数和格式的参数,这些后面都会详细讲解
总结
从这行代码中学习了什么呀,要命令计算机执行功能,可以借助【对象】、【方法】和【参数】来完成
-
刚才的例子中谁是对象?
- System.out
-
它代表什么?
- 标准输出
-
谁是方法?
- println 是方法
-
它有什么作用?
- 不同方法作用不同,println 将括号内内容,也就是参数输出到程序窗口
- 这其中参数比较自由,由我们提供,可以是 hello, world, 可以是你好,也可以是其它问候语
-
对象和方法是 java 提供的(当然以后我们也可以自己创建对象,定义新的方法,此乃后话)
至此为止,这行代码的含义讲解完毕
3) 为何要分成对象与方法
有同学问:Java的设计者搞个输出都这么麻烦,还分成对象和方法俩概念,把它们合为一个概念不是更简单吗?你看
- 对象用来表示被操作的物体,是名词
- 方法用来告知让这个物体执行什么动作,是动词
这种划分更符合现实世界中对事物的认知,例如,你叫住【皮卡丘】,皮卡丘就是待操作的对象,这时候他还不知道要做什么。好,你命令他【趴下】,这个趴下就是方法,是皮卡丘要执行的动作,你再命令他【吃饭】,这个吃饭是另一个方法。可以看到,现实世界都可以这么划分,那么把计算机中的虚拟物体抽象成对象和方法,当然也是顺理成章啦,这符合人类对事物的认知。
因此,不要怕麻烦,以后在 java 世界编写的代码,绝大多数都是这种对象+方法的形式,这称之为面向对象编程,今天我们还不会正式讲解面向对象编程,但同学们要建立起对象、方法的概念
2. 第一份源码
jshell 执行过的代码,在 jshell 退出后下次再想用,就不方便调出来了,正式的代码都会保存在类文件中,类文件的后缀是 .java,也称为 java 源代码
1) 源码结构
源码结构如下,一份源码中可以包含多个类,每个类中又可以包含多个方法,方法内再包含语句代码
class A {
方法1() {
// 语句代码
}
方法2() {
// 语句代码
}
入口方法() {
// 语句代码
}
}
class B {
}
这里我们关注其中一个特殊方法:入口方法。
入口方法的格式是固定的:
public static void main(String[] args) {
}
以后我们就称它为 main 方法
- main 并不从属于任何对象(由 static 修饰)
- main 方法内就可以书写之前学过的那行代码 System.out.println(“Hello, world”)
- 要注意与之前 jshell 中一点区别是,这里的每行代码以分号结束
刚才给大家介绍了源代码的结构
- 源代码中可以包含多个 class 类,每个类中再去套方法,方法内再去套代码,当我们把这些写好之后,能不能交给 JVM 来执行呢?
- 还不行,因为JVM不理解源码,需要通过 javac 开发工具把源代码编译成 class 字节码文件(这种字节码JVM可以理解)字节码文件的特点是后缀以 .class 结尾
- 最后再通过 java 工具可以将 class 字节码加载至 JVM,JVM 将字节码解释翻译为机器码,最终就可以由 CPU 执行啦。
2) 编写 java 源代码
进入 d:
盘
- 目的是为了找到一个合适存储 java 源代码的位置,也可以是其他位置,总之方便你找到它
C:\Users\Lenovo>d:
D:\>
运行记事本程序,notepad 是记事本程序名称
D:\>notepad
会打开如下窗口
输入如下代码
class Hello {
public static void main(String[] args) {
System.out.println("hello, world");
}
}
""
内的 hello, world 是我们自由书写,可以是英文、汉字class
后的 Hello 称之为【类名】,一般是英文单词- 其余代码要与例子中的【完全一致】,并严格区分大小写
保存文件,选择 文件->保存
或按它对应的快捷键 Ctrl+S
- 类名与最后的文件名请保持一致,保存为文件名以
.java
结尾 - 保存文件时,确保也存储于
d:
盘,方便待会找到它 - 编码位置也要注意,可能会影响到汉字的输出,后面会讲
3) 编译 java 源代码
关闭记事本程序,回到命令提示符程序,输入下面命令
D:\>javac Hello.java
-
javac
用来把一个*.java
文件编译成*.class
文件 -
*.class
就是前面提到的 class 字节码
本例中,生成的字节码文件为 Hello.class
,可以用 dir
命令查阅如下
4) 运行 class 字节码
输入下面命令
D:\>java Hello
hello, world
java
命令用来把 Hello.class 加载到 JVM 并执行它
3. cmd命令行运行Java文件产生乱码问题的解决方式
中文输出乱码
有的同学编写代码时用了中文
class Hello {
public static void main(String[] args) {
System.out.println("你好");
}
}
编译、执行后输出为
浣犲ソ
发音:huan chai so
原因在于,保存 Hello.java 文件时,选择了 UTF-8 编码,而 javac 编译时采用的是操作系统默认编码 GBK,只要两边编码不一致,就会发生上述的【乱码】问题
解决方法1
保存文件时,选择编码为 ANSI(对于记事本程序 ANSI 其实就是 GBK)
解决方法2
文件保存时,编码仍然是 UTF-8 不变,编译时改用下面的命令明确告诉编译器,编译时别用默认的 GBK,改用 UTF-8
D:\>javac -encoding utf-8 Hello.java
编译错误
有的同学在执行 javac 时会遇到各种各样的问题,例如
D:\>javac -encoding utf-8 Hello.java
Hello.java:3: 错误: 非法字符: '\uff1b'
System.out.println("你好");
^
1 个错误
遇到这种错误不用怕
- 其中
Hello.java:3
意思是说,Hello.java 中第 3 行出现错误,这样就可以定位错误位置 - 接下来它又提示了具体错误原因:
错误: 非法字符: '\uff1b'
,本例中是因为输入了中文分号;
,java 语法要求语句结束符号是英文分号;
- 这些错误原因需要慢慢积累,见的多了就知道该怎么解决了
4. 注释
注释就是对程序代码的一个说明,比如:
- 将来写的代码多了,你记性又没那么好,怕忘记某些代码的含义,这时候可以给它加一个注释
- 或是某些代码比较重要、特殊,这时也可以加一个注释进行说明
强调一点,注释只是对代码的说明,只影响代码阅读,不影响代码的功能。
注释的格式分成了单行注释,多行注释,还有文档注释三种。
单行注释
写在被注释代码的上方或右方,格式为
// 注释内容
多行注释
如果注释内容比较长,都写在一行影响阅读,这时候就用多行注释,格式为
/*
注释内容
注释内容
*/
文档注释
文档注释我们后面讲方法时再详细来讲吧,那现在呢,你只要了解它的格式:格式为:
/**
注释内容
*/
5. 思考-为何需要字节码
咱们先回忆一下 Java 程序的开发以及运行的流程
- 首先得编写一个Java的源文件,源文件编写好了就能交给CPU来执行吗?
- 还不行啊,他得经过一个编译的步骤,也就是用那个javac程序把它编译成字节码文件
- 这个字节码文件呢,再经过一个叫 java 程序加载到 jvm 虚拟机,
- jvm 虚拟机其实还做了一件很重要的事,就是把字节码文件给解释成机器码
- 机器码就是最为底层的代码了,CPU就可以识别和运行它
所以整个流程是先把源文件变成字节码,再把字节码变成机器码,最终由CPU执行。
那这里大家可以思考这么一个问题,源代码,最终要变成机器码,是不是才能被CPU执行,那为什么我们不直接把Java 源码翻译成机器代码,而是多出了字节码这么一个中间环节呢?
C++ 的翻译过程
要解释清楚这个问题啊,我们就必须介绍一点历史。在Java语言发明之前呢,有一个比较流行的编程语言叫做c++语言,这个c++语言它就没有中间的环节,可以把源文件直接他翻译成最终的机器码。有同学说这不挺好?但是呢有这么一个问题:不同平台下的这个机器码是不通用的。
举个例子,在windows平台下编写好了c++源代码,可以把它经编译器编译为windows平台的机器码,但是这个机器码呢,只能用在windows平台。想拿到Linux平台下用,用不了。必须在 Linux 平台下,重新编译成Linux机器码。看看这样的缺点
- 项目规模大了,源码编译也挺耗时间,在 windows 下编译一遍比如用了 20 分钟,测试通过了,将来要部署到 Linux 平台,又得编译一遍,再花 20 分钟… 时间都花在编译上了
- 程序员还得熟悉两个平台,做不到开发与部署环境相分离
说完了这是c++程序需要多次编译缺点,那咱们再来看看 Java 是怎么解决这个问题的。
Java 的翻译过程
Java做的就是加入了字节码这个中间环节,不管是在Linux下的编译还是在windows下的编译,生成的字节码是所有平台都通用的,你在windows平台生成的字节码在Linux平台一样用,反之亦然。可以看到
- 编译只需要一次,编译时间被节省了
- 程序员只需要工作在自己熟悉的平台上就可以了,做到了开发与部署环境的分离
这就是 java 所宣称的 write once run anywhere,编写一次,到处运行。
字节码虽然带来了这样一些便利,但大家思考一下,有什么问题吗?
对啦,问题就是字节码不是最终的机器码
- 需要在每个平台上安装 jvm 虚拟机,负责把字节码解释为机器码
- 另外因为引入了把字节码解释为机器码的步骤,性能上会有一定损失,当然 jvm 为了保证性能,内部会做很多优化,这等我们讲到 jvm 时,会有更深入的认识
小结
通过初步对比 c++ 和 java 的不同编译策略,我们学习到一个词 trade-off,权衡。
- c++ 直接编译生成机器码,性能无与伦比,但一旦改变平台,会带来额外的编译成本
- java 编译生成字节码,减少编译成本,增强灵活性,但性能不可避免受到影响,需要再通过其它方面补救
以后大家如果进入到程序设计的领域,就会明白,所谓设计更多的是在各个方面做出权衡,没有最佳,只有最适合。
四. IDE 工具
俗话说,工欲善其事,必先利其器,要准备好开发工具,才能提高开发效率。如果像开始那样,用记事本编写 java 代码,不仅慢,而且很容易出错。
首先来介绍 IDE 工具,IDE 即 Integrated Development Environment 集成开发环境,能够提供给开发者更好的编码、编译、测试环境
1. 常见 IDE 工具
Eclipse
老牌的 IDE 工具 Eclipse,有需要的同学可以根据下图下载尝试(Eclipse Downloads | The Eclipse Foundation)
它的特点是
- 完全免费
- 功能够用
Vscode
以上两个工具属于重量级的 IDE 工具,如果想追求轻量级的工具,推荐使用 Visual Studio Code
它的特点有
- 完全免费
- 更为轻量,占用磁盘空间比 eclipse 和 idea 少很多,前面两个工具属于重量级 ide 工具
- 系出名门,微软开发
- 插件丰富,通过插件几乎可以支持所有语言
最后要介绍的一个 IDE 工具叫 Intellij IDEA,号称是最智能的 java 开发工具
IntelliJ IDEA
新流行的 IDE 工具 IntelliJ IDEA,推荐大家用它(下载 IntelliJ IDEA:JetBrains 功能强大、符合人体工程学的 Java IDE)
它有三个版本
- Ultimate(最终版),功能最强,按年收费,价格不菲
- Community(社区版),功能够用
- 如果你是在校学生,可以申请教育版
- 通过教育邮箱免费申请IntelliJ IDE全家桶教程 - 简书 (jianshu.com)
特点
- 更加智能
因为我不想花钱,下载的是社区版,另外我选择的这种zip压缩格式的安装包,它使用起来更加简单,解压就能用
使用步骤
-
选中下载好的压缩文件,解压,这里解压到 d:盘,注意保留后面的文件夹名称
-
进入d盘,进入解压目录中 bin子目录,找到一个名叫 idea64的程序双击,就可以运行了。
2. IntelliJ IDEA 的配置及使用
本教程使用 IntelliJ IDEA Community 2022.1(截至本教程开始开发时的最新版本)
1) 安装启动
首次运行,会弹出下面窗口
意思是是否导入以前的设置(settings),因为我们是第一次安装,所以就选择默认的不导入设置
出现 splash 欢迎页
接下来进入主界面
在学习 idea 之前,先来做几项简单的设置,可以改改颜色主题(Customize -> Color theme
)
如果选择 Sync with OS
,意思就是根据操作系统改变主题(白天亮、夜晚暗)
推荐安装翻译插件,方便阅读文档
2) 创建项目
创建新项目(Project)
在 IDEA 中【项目】和【模块】用来组织代码
- 一个【项目】(Project)包含多个【模块】(Module)
- 一个【模块】(Module)包含多个【源文件】
点击【新建项目】(New Project)后出现界面
其中
- 存储位置中的
~
代表当前用户目录- 如我的 Windows 系统用户名为
Lenovo
,则~
对应目录为C:\Users\Lenovo
- 你也可以选择其它目录来存储【项目】位置,但注意目录中不建议有中文和空格
- 如我的 Windows 系统用户名为
- 语言这目前选择
Java
,但要知道 JVM 还能运行其它几种语言:Kotlin
和Groovy
- 项目类型目前选择
IntelliJ
,后续我们还会学习Maven
和Gradle
- 如果安装了 JDK,会出现在这个下拉列表中
- 如果勾选了
Add sample code
,则会生成一个简单的实例代码
点击 Create
按钮后
首次进入项目会在右下角显示两个弹窗通知
建议都点一下
- 前者能将 IntelliJ IDEA 的菜单中文化
- 后者能加速 IDEA 的使用速度
因为前面勾选了实例代码,因此 idea 已经帮我们生成了一个简单的源文件,看一下,里面已经包含了类、main 方法和一段 hello world 代码。
3) 运行代码
五. 实用工具
1. Ubuntu 子系统
如果用 Windows 操作系统,推荐安装 Linux 子系统,即 WSL
- 适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销
- 官方安装文档:安装 WSL | Microsoft Docs
1) 安装 wsl 工具
wsl --install
2) 安装 Ubuntu 子系统
Ubuntu 是一种非常流行的 Linux 系统,打开微软应用商店
搜索 ubuntu
选一个版本安装(我用的是 18.04 LTS)
3) 运行 Ubuntu 子系统
安装完毕后,打开命令提示符,输入 wsl,即可进入 Ubuntu 子系统
这里就可以运行各种 Linux 下的 App 了,当然我们主要用的是命令行下的 App,图形界面的 App 不行
2. 终端工具
命令提示符这个工具虽然能用,但是界面比较 low,这里给大家介绍一款终端工具:Fluent Terminal,也是在微软应用商店搜索
运行界面如下
好处是同时支持三种终端
- CMD(命令提示符)
- PowerShell(Windows 下另一个终端工具)
- WSL
3. 截图工具
做笔记的神器:Snipaste,也是在微软应用商店搜索
4. 笔记工具
笔记神器:Typora,1.0 版本后收费 89 元(可以找找低版本的),当然你也可以选择其它笔记工具
5. 思维导图工具
推荐使用 Xmind 工具,免费的功能就够用