1995 年 5 月 23 日,Sun Microsystems 公司宣布 Java 语言诞生, 当时使用 Java 的总人数还不到 30 人,可能包括 Java 语言之父詹姆斯·高斯林在内的大多数联合创始人都无法预想,Java 在未来的二十年间,居然会给互联网乃至我们的生活带来如此深远的影响。目前 Java 提供以下三个版本:Java Platform, Enterprise Edition(Java EE:Java 平台企业版);Java Platform, Standard Edition(Java SE:Java 平台标准版);Java Platform, Micro Edition(Java ME:Java 平台微型版)。2006 年,SUN 公司在 JavaOne 大会上,宣布在 GNU 通用公共协议(GPL)的构架下向开源世界贡献 Java 平台,这次开放的 Java 版本包括了其标准版(Standard)、微型版(Micro)以及企业版(Enterprise)。这是一个具有 “历史性意义” 的改变。
我们知道 Java 是平台无关的编程语言,它是运行在 Java 虚拟机之上的,而 Java 虚拟机又是运行在 Native 系统上的。那么,如何通过 Java 程序检测系统本身的字节序呢?可以通过 java.nio.ByteOrder 类来测试当前 Native 系统的字节序。调用 ByteOrder 的 nativeOrder 方法,就能返回系统本身的字节序。另外,ByteOrder 还定义了两个 ByteOrder 类型的常量常用:ByteOrder.BIG_ENDIAN 表示大端序ByteOrder.LITTLE_ENDIAN 表示小端序检测程序也很简单,如下:public static void testByteOrder(){ System.out.println("The native byte order: " + ByteOrder.nativeOrder());}检测结果如下:The native byte order: LITTLE_ENDIAN
在前面的小节中,我们学习了数组,本小节学习的集合同样用于存放一组数据,我们将学习什么是集合、集合的应用场景 ,在应用场景部分我们将对比 Java 数组与集合的区别,还将系统介绍 Java 集合的架构,也将结合实例来讲解集合的实际应用。
在前面的Java 字符串小节,我们就已经接触了String类,但并未提及String类相关的操作,现在有了面向对象相关前置知识,我们知道了类下面可以有相关的操作,作为Java语言的内置类,String类也为我们预先定义了很多好用的方法,本小节我们将介绍String类的常用方法,并结合示例辅助理解。
本小节我们将学习 Java 的包装类,我们将了解到什么是包装类,为什么需要包装类,Java 提供的包装类有哪些,各种包装类的常用方法和常量介绍,什么是装箱操作以及什么是拆箱操作等内容。
本小节我们将介绍如何在 Windows 平台安装 Java 。由于微软已正式终止对 Win7 操作系统的支持,作为新时代的程序员,我们使用 Win10 操作系统来进行安装演示。如果你想在其他平台安装 Java,请查看对应平台的安装教程:在 MacOS 上安装 Java在 Linux 上安装 Java
Linux上的卸载与其他操作系统有所不同。有必要单独说明一下。执行如下命令,可查看操作系统中的 JDK版本rpm -qa | grep jdk可以看到我们的系统上存在两个版本的 Java,执行命令删除对应版本:yum -y remove java jdk-13.0.2-13.0.2-ga.x86_64
本小节我们将介绍如何在 MacOS 平台安装 Java 。如果你想在其他平台安装 Java,请查看对应平台的安装教程:在 Windows 上安装 Java在 Linux 上安装 Java
在 Java 基本数据类型一节中,我们已经知道 Java 中有两大数据类型:一个是基本数据类型,另一个是引用数据类型。字符串(String)便属于引用数据类型。字符串在 Java 程序中无处不在,其实我们在第一个 Java 程序中就已经使用过了字符串,打印语句中双引号中的Hello World就是一个字符串:System.out.println("Hello World");本小节我们将介绍字符串的基础知识,告诉你如何创建一个字符串,也会讲到 Java 13支持的多行字符串的创建方法和注意事项,还会介绍很常用的字符串的连接操作,最后我们也会着重讨论字符串的一个重要特性:不可变性。需要注意的是,String是在java.lang包中定义的内置类,了解它的相关操作需要面向对象的前置知识,为了减少初学者的困扰,字符串的相关操作不会在本小节讨论。我们将在完成面向对象的学习后专门讲解String类。
我们已经学会了如何声明变量和赋值变量。那么你可能想知道如何对它们进行操作。本小节我们学习的运算符就可以对它们进行运算。运算符是一些特殊的符号,它们对一个,两个或多个操作数执行特定的运算,然后返回一个结果。这里的操作数指的就是运算符操作的实体。Java提供了一组丰富的运算符来操作变量。 我们可以将所有Java运算符分为以下几类:算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符本小节我们将按照以上分类介绍 Java 中的运算符,并在最后介绍运算符的优先级。
本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。
同学们可能有个疑问,Java 的版本已经更新到了 15,本教程使用的版本也是最新的 Java 15,为什么还要介绍Java 8的新特性呢?为什么不去介绍 Java 15 的新特性呢?这是因为 Java 8 是一个有重大改变的版本,该版本对 Java 做了重大改进。Java 8 由 Oracle 公司在 2014 年 3 月发布,可以看成是自 Java 5 以后的最具革命性的版本。至今仍是企业级应用最优先考虑使用的版本。Java 8 以后大的版本更新速度比较快,同学们没有必要每个版本的新特性都去研习,有些“新特性”只是尝试,不一定好用,也可能在将来的版本被废弃掉,因此我们学习最稳定的 Java 8 新特性即可。(如果你想了解 Java 15 的新特性,建议去官方文档翻阅。)本小节我们将列举并概述 Java 8 的核心新特性,有一部分特性我们已经在前面的小节中介绍过,还有一部分没有介绍过的新特性,由于内容较多切较为重要,本小节将简要介绍,详细内容在之后的几个小节中展开介绍。
本小节我们将介绍如何在 Linux 平台安装 Java 。我们选用最常用的 Linux 发行版本 CentOS 来进行(注:版本号为CentOS 7.6)。如果你想在其他平台安装 Java,请查看对应平台的安装教程:在 Windows 上安装 Java在 MacOS 上安装 Java
要在 Eclipse 中创建一个 Java 项目,我们需要找到 Java Project 选项。首先打开我们的 Eclipse,通过点击 File->New->Project,如下图所示:点击 Project 后,我们会打开 New Project 窗口,在这个窗口中我们就可以看到有 Java Project 这个选项了,如下图所示:如果在 New Project 界面没有看到 Java Project 的选项,那么我们也可以通过展开窗口内的 Java 选项来找到它,如下图所示:事实上,在 New Project 窗口中,我们更常使用的是它提供给我们的搜索框,只要输入相关字眼,它就可以帮我筛选出我们想要新建的项目选项,如下图所示:点击 Next,我们将打开 New Java Project 窗口。
Java 的主要发行版本及其发行日期如下:JDK 1.0(1996 年 1 月 23 日)JDK 1.1(1996 年 2 月 19 日)J2SE 1.2(1998 年 12 月 8 日)J2SE 1.3(2000 年 5 月 8 日)J2SE 1.4(2002 年 2 月 6 日)J2SE 5.0(2004 年 9 月 30 日)Java SE 6(2006 年 12 月 11 日)Java SE 7(2011 年 7 月 28 日)Java SE 8(2014 年 3 月 18 日)Java SE 9(2017 年 9 月 21 日)Java SE 10(2018 年 3 月 20 日)Java SE 11(2018 年 9 月 25 日)Java SE 12(2019 年 3 月 19 日)Java SE 13(2019 年 9 月 17 日)Java SE 14(2020 年 3 月 17 日)Java SE 15(2020 年 9 月 15 日)Java SE 16(2021 年 3 月 16 日)
在 Java 中,程序不是直接被编译为可执行文件,而是被编译为字节码文件, JVM(Java虚拟机)在运行时执行字节码文件。当我们使用 javac 编译器时,Java 源代码文件被编译为字节码文件,字节码文件以扩展名 .class 的形式保存在磁盘上。当程序运行时,字节码文件将被转换为机器代码,并在内存中执行。总的来说,Java 源代码需要被“转换”两次才能被计算机执行:Java 源代码被编译为字节码:由 javac 前端编译器完成;字节码被编译为机器码:由 JVM 的执行引擎完成。下图描述了一个Java程序从编写到编译,再到执行的步骤:
要在 Eclipse 中创建 Java 类,我们通常会通过如下步骤:在项目资源浏览器视图中,鼠标右键我们想存放的 Java类的文件夹,在弹出的菜单中 New -> Class,如下图所示:接着在弹出的新建 Java类的窗口中填写类相关的信息即可,其中我们需要关注的信息如下:Source Folder 字段默认值是项目的文件夹,通常不需要更改;Package 字段输入包名;Name 字段输入类名;在 Which method would you like te creat 的部份,勾选 public static void main(String[] args) 的话,会帮助我们创建 main 方法。如下图所示:Tips:包名并非必填项,如果不填写包名,将会创建默认包名,这不是一种好的做法,所以还是建议创建类的时候也填写包名点击 Finish 后,我们将会看到 Eclipse 会帮助我们创建对应的包和 Java 类文件,如下图所示:
Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常、Java 中异常类的架构、如何进行异常处理、如何自定义异常、什么是异常链、如何使用异常链等内容。
本小节我们将学习 Java 接口(interface),通过本小节的学习,你将了解到什么是接口、为什么需要接口、如何定义和实现接口,以及接口的特点等内容。最后我们也将对比抽象类和接口的区别。
本小节我们将学习 Java5 引入的一种机制 —— 注解(Annotation)。通过本小节的学习,你将了解什么是注解,注解的作用,Java 中内置注解有哪些以及注解的分类,如何自定义注解,如何处理注解等内容。
流式操作,是 Java 8 除了Lambda表达式外的又一重大改变。学习流式操作,就是学习java.util.stream包下的API,我们称之为Stream API,它把真正的函数式编程引入到了 Java 中。本小节我们将了解到什么是Stream,为什么使用Stream API, 流式操作的执行流程,如何实例化Stream,Stream的中间操作、Stream的终止操作等内容。
本小节我们将介绍 Java 语言中也是编程语言中的一个基本概念:变量。通过本小节的学习,你将了解到变量是什么,如何创建变量,如何操作变量,变量的命名规范,这些是我们本小节学习的重点。我们也会介绍常量的概念和使用。
前面我们学习了变量,每个变量都是有数据类型的。在 Java 中,一共有两大数据类型:基本数据类型(内置数据类型)引用数据类型本小节,我们将主要介绍基本数据类型,除了我们在示例中经常用到的 int 类型外,Java 语言还有其他 7 种基本数据类型。它们由语言预先定义,也称内置数据类型,顾名思义,它们是 Java 语言中最基本的数据类型。另外注意:引用数据类型并不属于基本数据类型的范畴,我们将在后面讲解。Java 语言支持 8 种基本数据类型:byte,short,int,long,float,double,char 和 boolean
在 Java 中,通过 Throwable 及其子类来描述各种不同类型的异常。如下是 Java 异常类的架构图(不是全部,只展示部分类):
本小节我们将学习 Java 中的抽象类,你将了解到抽象类的概念和特点,抽象类在程序设计时的应用场景,什么是抽象方法,抽象方法有什么特点,如何声明一个抽象方法等内容。
通过JavaScript的由来可以知道,两个语言本质上没有太大的关系,仅仅只为了让他们像,才让 JavaScript 的名字中有了 Java ,才让他的内部的一些设计机制像 Java。事实上 JavaScript 上在设计上还融合了C语言的语法,Self语言的原型设计等。
本小节我们将介绍 Java 语言的基础语法,包括我们在编写第一个 Java 程序时已接触过的类、主方法的概念,以及在编程中给源代码文件和类起名字的时候应该注意什么,什么样的名字是可以使用的,什么样的名字是不可以使用的,还有如何为代码添加注释等内容。只有掌握了这些最基础的知识,才能减少后续学习中的困扰,避免踩坑。
Java 的 java.io.* 包中包含了 InputStream 和 OutputStream 两个类,是 Java 字节流 I/O 的基础类,其他具体的 Java I/O 字节流功能类都派生自这两个类。图中只列出了我们 Socket 编程中常用的 I/O 字节流类。java.net.SocketInputStream 类是 Socket 的输入流实现类,它继承了 java.io.FileInputStream 类。java.net.SocketOutputStream 类是 Socket 的输出流实现类,它继承了 java.io.FileOutputStream 类,下来我们逐一介绍这些类的基本功能。
java.nio.channels.Channel 是一个 Java 接口,是整个 Channel 家族的祖先,声明的接口如下:// 获取 Channel 的状态public boolean isOpen();// 关闭 channelpublic void close() throws IOException;Java NIO Channel 具有以下特性:Java NIO 支持面向字节流的数据读写方式,数据从 ByteBuffer 读取后写到 Channel 中,或者从 Channel 中读取后写入 ByteBuffer 中。Java NIO Channel 支持字节流读写双向操作,一个处于 Open 状态的 Channel,既可以进行读操作、也可以进行写操作。Java NIO Channel 支持阻塞和非阻塞两种模式。Java NIO Channel 是线程安全的。
本小节我们将学习 Java 多线程,通过本小节的学习,你将了解到什么是线程,如何创建线程,创建线程有哪几种方式,线程的状态、生命周期等内容。掌握多线程的代码编写,并理解线程生命周期等内容是本小节学习的重点。