为什么 Java 应用最广泛?

从互联网到企业平台,Java 是应用最广泛的编程语言,原因在于:

  • Java 是基于 JVM 虚拟机的跨平台语言,一次编写,到处运行;

  • Java 程序易于编写,而且有内置垃圾收集,不必考虑内存管理;

  • Java 虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;

  • Java 拥有最广泛的开源社区支持,各种高质量组件随时可用。

Java 语言常年霸占着三大市场:

  • 互联网和企业应用,这是 Java EE 的长期优势和市场地位;

  • 大数据平台,主要有 Hadoop、Spark、Flink 等,他们都是 Java 或 Scala(种运行于 JVM 的编程语言)开发的;

  • Android 移动平台。

快速入门

本章的主要内容是快速掌握 Java 程序的基础知识,了解并使用变量和各种数据类型,介绍基本的程序流程控制语句。

Java 历史

ava 最早是由 SUN 公司(已被 Oracle 收购)的https://en.wikipedia.org/wiki/James_Gosling(高司令,人称 Java 之父)在上个世纪 90 年代初开发的一种编程语言,最初被命名为 Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让 Oak 重新焕发了生机,于是 SUN 公司改造了 Oak,在 1995 年以 Java 的名称正式发布,原因是 Oak 已经被人注册了,因此 SUN 注册了 Java 这个商标。随着互联网的高速发展,Java 逐渐成为最重要的网络编程语言。

Java 介于编译型语言和解释型语言之间。编译型语言如 C、C++,代码是直接编译成机器码执行,但是不同的平台(x86、ARM 等)CPU 的指令集不同,因此,需要编译出每一种平台的对应机器码。解释型语言如 Python、Ruby 没有这个问题,可以由解释器直接加载源码然后运行,代价是运行效率太低。而 Java 是将代码编译成一种“字节码”,它类似于抽象的 CPU 指令,然后,针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了“一次编写,到处运行”的效果。当然,这是针对 Java 开发者而言。对于虚拟机,需要为每个平台分别开发。为了保证不同平台、不同公司开发的虚拟机都能正确执行 Java 字节码,SUN 公司制定了一系列的 Java 虚拟机规范。从实践的角度看,JVM 的兼容性做得非常好,低版本的 Java 字节码完全可以正常运行在高版本的 JVM 上。

随着 Java 的发展,SUN 给 Java 又分出了三个不同版本:

  • Java SE:Standard Edition

  • Java EE:Enterprise Edition

  • Java ME:Micro Edition

搭建开发环境

要开始学习 Java 编程,我们需要首先搭建开发环境。

本节我们介绍如何安装 JDK,在命令行编译 Java 程序,以及如何使用 IDE 来开发 Java。

安装 JDK

因为 Java 程序必须运行在 JVM 之上,所以,我们第一件事情就是安装 JDK。

搜索 JDK 25,确保从https://www.oracle.com/java/technologies/downloads/下载最新的稳定版 JDK:

Java SE Development Kit 25 downloads

Linux  macOS  Windows
              -------

x64 Compressed Archive      Download
x64 Installer               Download
x64 MSI Installer           Download

选择合适的操作系统与安装包,找到 Java SE 25 的下载链接 Download,下载安装即可。Windows 优先选 x64 MSI Installer,Linux 和 macOS 要根据自己电脑的 CPU 是 ARM 还是 x86 来选择合适的安装包。

设置环境变量

安装完 JDK 后,需要设置一个 JAVA_HOME 的环境变量,它指向 JDK 的安装目录。在 Windows 下,它是安装目录,类似:

C:\Program Files\Java\jdk-25

在 macOS 下,它在 ~/.bash_profile~/.zprofile 里,它是:

export JAVA_HOME=`/usr/libexec/java_home -v 25`

然后,把 JAVA_HOMEbin 目录附加到系统环境变量 PATH 上。在 Windows 下,它长这样:

Path=%JAVA_HOME%\bin;<现有的其他路径>

在 macOS 下,它在 ~/.bash_profile~/.zprofile 里,长这样:

export PATH=$JAVA_HOME/bin:$PATH

JAVA_HOMEbin 目录添加到 PATH 中是为了在任意文件夹下都可以运行 java。打开 PowerShell 窗口,输入命令 java -version,如果一切正常,你会看到如下输出:

┌─────────────────────────────────────────────────────────┐
│Windows PowerShell                                 - □ x │
├─────────────────────────────────────────────────────────┤
│Windows PowerShell                                       │
│Copyright (C) Microsoft Corporation. All rights reserved.│
│                                                         │
│PS C:\Users\liaoxuefeng> java -version                   │
│java version "25" ...                                    │
│Java(TM) SE Runtime Environment                          │
│Java HotSpot(TM) 64-Bit Server VM                        │
│                                                         │
└─────────────────────────────────────────────────────────┘

如果你看到的版本号不是 25,而是 151.8 之类,说明系统存在多个 JDK,且默认 JDK 不是 JDK 25,需要把 JDK 25 提到 PATH 前面。

如果你得到一个错误输出:“无法将“java”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。”:

┌─────────────────────────────────────────────────────────┐
│Windows PowerShell                                 - □ x │
├─────────────────────────────────────────────────────────┤
│Windows PowerShell                                       │
│Copyright (C) Microsoft Corporation. All rights reserved.│
│                                                         │
│PS C:\Users\liaoxuefeng> java -version                   │
│java : The term 'java' is not recognized as ...          │
│...                                                      │
│    + FullyQualifiedErrorId : CommandNotFoundException   │
│                                                         │
└─────────────────────────────────────────────────────────┘

这是因为系统无法找到 Java 虚拟机的程序 java.exe,需要检查 JAVA_HOMEPATH 的配置。

可以参考https://www.java.com/zh-CN/download/help/path.html

JDK

细心的童鞋还可以在 JAVA_HOMEbin 目录下找到很多可执行文件:

  • java:这个可执行程序其实就是 JVM,运行 Java 程序,就是启动 JVM,然后让 JVM 执行指定的编译后的代码;

  • javac:这是 Java 的编译器,它用于把 Java 源码文件(以.java 后缀结尾)编译为 Java 字节码文件(以.class 后缀结尾);

  • jar:用于把一组.class 文件打包成一个.jar 文件,便于发布;

  • javadoc:用于从 Java 源码中自动提取注释并生成文档;

  • jdb:Java 调试器,用于开发阶段的运行调试。

第一个 Java 程序 Java 程序基础

我们来编写第一个 Java 程序。

打开文本编辑器,输入以下代码:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

在一个 Java 程序中,你总能找到一个类似:

public class Hello {
    ...
}

的定义,这个定义被称为 class(类),这里的类名是 Hello,大小写敏感,class 用来定义一个类,public 表示这个类是公开的,publicclass 都是 Java 的关键字,必须小写,Hello 是类的名字,按照习惯,首字母 H 要大写。而花括号 {} 中间则是类的定义。

注意到类的定义中,我们定义了一个名为 main 的方法:

public static void main(String[] args) {
  ...
}

方法是可执行的代码块,一个方法除了方法名 main,还有用 () 括起来的方法参数,这里的 main 方法有一个参数,参数类型是 String[],参数名是 argspublicstatic 用来修饰方法,这里表示它是一个公开的静态方法,void 是方法的返回类型,而花括号 {} 中间的就是方法的代码。

方法的代码每一行用; 结束,这里只有一行代码,就是:

System.out.println("Hello, world!");

它用来打印一个字符串到屏幕上。

Java 规定,某个类定义的 public static void main(String[] args) 是 Java 程序的固定入口方法,因此,Java 程序总是从 main 方法开始执行。

注意到 Java 源码的缩进不是必须的,但是用缩进后,格式好看,很容易看出代码块的开始和结束,缩进一般是 4 个空格或者一个 tab。

最后,当我们把代码保存为文件时,文件名必须是 Hello.java,而且文件名也要注意大小写,因为要和我们定义的类名 Hello 完全保持一致。

如何运行 Java 程序

Java 源码本质上是一个文本文件,我们需要先用 javacHello.java 编译成字节码文件 Hello.class,然后,用 java 命令执行这个字节码文件:

┌──────────────────┐
│    Hello.java    │◀── source code
└──────────────────┘
          │ compile
          ▼
┌──────────────────┐
│   Hello.class    │◀── byte code
└──────────────────┘
          │ execute
          ▼
┌──────────────────┐
│    Run on JVM    │
└──────────────────┘

因此,可执行文件 javac 是编译器,而可执行文件 java 就是虚拟机。

第一步,在保存 Hello.java 的目录下执行命令 javac Hello.java

$ javac Hello.java

如果源代码无误,上述命令不会有任何输出,而当前目录下会产生一个 Hello.class 文件:

$ ls
Hello.class	Hello.java

第二步,执行 Hello.class,使用命令 java Hello(注意不是 java Hello.class):

$ java Hello
Hello, world!

注意:给虚拟机传递的参数 Hello 是我们定义的类名,虚拟机自动查找对应的 class 文件并执行。

如果执行 java Hello 报错:

$ java Hello
Error: Could not find or load main class Hello
Caused by: java.lang.ClassNotFoundException: Hello

出现 ClassNotFoundException 信息,说明在当前目录下并没有 Hello.class 这个文件,请切换到 Hello.class 的目录,然后执行 java Hello

有一些童鞋可能知道,直接运行 java Hello.java 也是可以的:

$ java Hello.java 
Hello, world!

这是从 Java 11 开始新增的一个功能,它可以直接运行一个单文件源码!

需要注意的是,在实际项目中,单个不依赖第三方库的 Java 源码是非常罕见的,所以,绝大多数情况下,我们无法直接运行一个 Java 源码文件,原因是它需要依赖其他的库。

小结

一个 Java 源码只能定义一个 public 类型的 class,并且 class 名称和文件名要完全一致;

使用 javac 可以将.java 源码编译成.class 字节码;

使用 java 可以运行一个已编译的 Java 程序,参数是类名。

使用 IDE

IDE 是集成开发环境:Integrated Development Environment 的缩写。

使用 IDE 的好处在于,可以把编写代码、组织项目、编译、运行、调试等放到一个环境中运行,能极大地提高开发效率。

IDE 提升开发效率主要靠以下几点:

  • 编辑器的自动提示,可以大大提高敲代码的速度;

  • 代码修改后可以自动重新编译,并直接运行;

  • 可以方便地进行断点调试。

目前,流行的用于 Java 开发的 IDE 有:

Eclipse

https://www.eclipse.org/是由 IBM 开发并捐赠给开源社区的一个 IDE,也是目前应用最广泛的 IDE。Eclipse 的特点是它本身是 Java 开发的,并且基于插件结构,即使是对 Java 开发的支持也是通过插件 JDT 实现的。

除了用于 Java 开发,Eclipse 配合插件也可以作为 C/C++ 开发环境、PHP 开发环境、Rust 开发环境等。

IntelliJ Idea

https://www.jetbrains.com/idea/是由 JetBrains 公司开发的一个功能强大的 IDE,分为免费版和商用付费版。JetBrains 公司的 IDE 平台也是基于 IDE 平台 + 语言插件的模式,支持 Python 开发环境、Ruby 开发环境、PHP 开发环境等,这些开发环境也分为免费版和付费版。

NetBeans

https://netbeans.org/是最早由 SUN 开发的开源 IDE,由于使用人数较少,目前已不再流行。

使用 Eclipse

你可以使用任何 IDE 进行 Java 学习和开发。我们不讨论任何关于 IDE 的优劣,本教程使用 Eclipse 作为开发演示环境,原因在于:

  • 完全免费使用;

  • 所有功能完全满足 Java 开发需求。

安装 Eclipse

Eclipse 的发行版提供了预打包的开发环境,包括 Java、JavaEE、C++、PHP、Rust 等。从https://www.eclipse.org/downloads/packages/下载:

我们需要下载的版本是 Eclipse IDE for Java Developers:

eclipse-jdt.jpg

根据操作系统是 Windows、Mac 还是 Linux,从右边选择对应的下载链接。

注意

教程从头到尾并不需要用到 Enterprise Java 的功能,所以不需要下载 Eclipse IDE for Enterprise Java Developers

设置 Eclipse

下载并安装完成后,我们启动 Eclipse,对 IDE 环境做一个基本设置:

选择菜单“Eclipse/Window”-“Preferences”,打开配置对话框:

eclipse-pref.jpg

我们需要调整以下设置项:

General > Editors > Text Editors

钩上“Show line numbers”,这样编辑器会显示行号;

General > Workspace

钩上“Refresh using native hooks or polling”,这样 Eclipse 会自动刷新文件夹的改动;

对于“Text file encoding”,如果 Default 不是 UTF-8,一定要改为“Other:UTF-8”,所有文本文件均使用 UTF-8 编码;

对于“New text file line delimiter”,建议使用 Unix,即换行符使用 \n 而不是 Windows 的 \r\n

eclipse-encoding.png

Java > Compiler

将“Compiler compliance level”设置为 20,本教程的所有代码均使用 Java 20 的语法,并且编译到 Java 20 的版本。

去掉“Use default compliance settings”并钩上“Enable preview features for Java 20”,这样我们就可以使用 Java 20 的预览功能。

注意

如果 Compiler compliance level 没有 22 这个选项,请更新到最新版 Eclipse。如果更新后还是没有 22,打开 Help - Eclipse Marketplace,搜索 Java 22 Support 安装后重启即可。

Java > Installed JREs

在 Installed JREs 中应该看到 Java SE 20,如果还有其他的 JRE,可以删除,以确保 Java SE 20 是默认的 JRE。

Eclipse IDE 结构

打开 Eclipse 后,整个 IDE 由若干个区域组成:

eclipse-workspace-GcVj.jpg
  • 中间可编辑的文本区(见 1)是编辑器,用于编辑源码;

  • 分布在左右和下方的是视图:

    • Package Exploroer(见 2)是 Java 项目的视图

    • Console(见 3)是命令行输出视图

    • Outline(见 4)是当前正在编辑的 Java 源码的结构视图

  • 视图可以任意组合,然后把一组视图定义成一个 Perspective(见 5),Eclipse 预定义了 Java、Debug 等几个 Perspective,用于快速切换。

新建 Java 项目

在 Eclipse 菜单选择“File”-“New”-“Java Project”,填入 HelloWorld,JRE 选择 Java SE 22

eclipse-new-java-proj.jpg

暂时不要勾选“Create module-info.java file”,因为模块化机制我们后面才会讲到:

eclipse-new-java-proj-2.png

点击“Finish”就成功创建了一个名为 HelloWorld 的 Java 工程。

新建 Java 文件并运行

展开 HelloWorld 工程,选中源码目录 src,点击右键,在弹出菜单中选择“New”-“Class”:

eclipse-new-class.png

在弹出的对话框中,Name 一栏填入 Hello:

eclipse-new-class-2.png

点击”Finish“,就自动在 src 目录下创建了一个名为 Hello.java 的源文件。我们双击打开这个源文件,填上代码:

eclipse-edit.jpg

保存,然后选中文件 Hello.java,点击右键,在弹出的菜单中选中“Run As...”-“Java Application”:

eclipse-run.jpg

在 Console 窗口中就可以看到运行结果:

eclipse-result.png

流程控制

数组操作