《Java核心技术卷Ⅰ》
《Java核心技术卷Ⅰ》阅读笔记,更新中——
第一章 Java程序设计概述
1.1 Java白皮书
1)简单性
2)面向对象
3)分布式
4)健壮性
5)安全性
6)体系结构中立
7)可移植性
8)解释性
9)高性能
10)多线程
11)动态性
1.1.1 简单性
Java可以说是C++的一个纯净版本。Java没有头文件、指针运算、结构、联合、操作符重载、虚基类等。同时C++和Java的语法很相似。
1.1.2 面向对象
Java的面向和C++的面向对象旗鼓相当。Java和C++的不同点在于多重继承,在Java中,取而代之的是接口。与C++相比,Java提供了更丰富的运行时自省功能。[?]
1.1.3 分布式
Java有丰富的库用于处理HTTP和FTP之类的协议,是的访问URL和网上内容很便捷。
1.1.4 健壮性
Java与C/C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。[?]
Java编译器能够检测许多其他语言中仅在运行时才能够检测出来的问题。
1.1.5 安全性
一开始的Java程序并不安全,存在一些小Bug。
1.1.6 体系结构中立
Java能够生成体系结构中立的目标文件格式(.class)。这是一种编译型代码,它可以在很多处理器上运行。可以在虚拟机上转化为原生机器代码。
解释虚拟机指令肯定比全速运行机器指令慢得多。不过,虚拟机有个选项,可以将执行最频繁的字节码序列转换成机器码,即即时编译(just-in-time compliation)
。
1.1.7 可移植性
- Java中的int总是32位整数,不像C++中int'大小依据操作系统。
- 二进制数据以固定的格式进行存储和传输,消除了有关字节顺序的困扰。[?]
- 字符串采用标准的Unicode格式存储。
- 很多Java库也能很好地支持平台独立性,无需顾虑底层操作系统。
1.1.8 解释性
Java9 提供了jshell工具来支持类似于逐行执行并能直接看到结果的编程。
1.1.9 高性能
现在的即时编译器已经非常出色,可以和传统编译器相媲美。即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。还能消除函数调用(即“内联”)。即时编译器知道已经加载了哪些类。基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。[?]
1.1.10 多线程
摩尔定律即将走到尽头,我们不在追求更快的处理器,而是着眼于更多的处理器。Java支持多线程。
1.1.11 动态性
Java本质为静态语言,而不是动态语言。动态语言显著的特点是在程序运行时,可以改变程序结构或变量类型,典型的动态语言有Python、ruby、javascript等。Java不是动态语言,但Java具有一定的动态性。[?]
1.2 Java发展简史
Java版本分为三种,标准版(Java SE)
、微型版(Java ME)
、企业版(Java EE)
。
Java版本的更迭
第二章 Java编程环境
2.1 安装Java开发工具包
2.1.1 下载JDK
从Java官网下载JDK ⬇️Java Downloads | Oracle
🌈 JDK、JRE,SE、EE、ME,Java 版本的区别
- JDK (Java DevelopmentnKit)(Java 开发工具包)
- JRE (Java Runtime Environment)(Java 运行环境)
- JDK(Java Development Kit)实际上包含了JRE(Java Runtime Environment)。JDK是Java开发工具集,它包含了用于开发Java应用程序的工具,如编译器(javac),打包工具(jar)等。而JRE则是Java程序的运行环境,它包括Java虚拟机(JVM)和Java类库。
- Java SE(Java Standard Edition)是一个广义的术语,它包括了Java的开发工具(JDK),运行环境(JRE),以及其他的一些组件。而JDK(Java Development Kit)是Java SE的一部分。
另外,OpenJDK
是Java SE 的一个免费开源实现;LTS(Long Term Support)
是长期支持版本。
2.1.2 设置 JDK
需要配置环境变量路径,此步骤省略。
2.2 使用命令行执行Java程序
-
打开终端,cd到java文件目录下
-
输入命令
javac Welcome.java java Welcome
过程解读:
javac程序是一个Java编译器,它将文件 Welcome.java 编译成 Welcome.class 字节码文件。Java 程序启动Java虚拟机,虚拟机执行字节码文件。
2.3 JShell 的使用
⭐ 启动JShell
只需要在终端窗口输入 jshell
即可
⭐ 使用JShell
可以输入"Core Java".length()
可以得到结果,可以使用 Math.
,然后加个Tab
键,可以得到方法列表。
第三章 Java的基本程序设计结构
3.1 分析一个简单的Java程序
public class Welcome
{
public static void main(String[] args)
{
System.out.println("We will not use 'Hello, World!'");
}
}
分析如下:
3.2 注释
⭐注释总共有三种://
、/* */
、/** */ ( 用于生成文档注释 )
3.3 数据类型
- Java是一种强类型语言。
- Java中有8种基本类型,其中有4种整型
int、short、long、byte
、2种浮点类型float、double
、1 种字符类型char
和1 种表示真值boolean
。
3.3.1 整型
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4字节 | -2147483648 ~ 2147483647 |
short | 2字节 | -32768 ~ 32767 |
long | 8字节 | -9223372036854775808 ~ 9223372036854775808 |
byte | 1字节 | -128 ~ 127 |
- 通常情况下使用
int
- 各种数据类型的取值范围是固定的
- 长整型有个后缀
L
或l
。十六进制有个前缀0x
或0X
。八进制前有个前缀0
。加上前缀0b
或者0B
还可以写二进制数。 - 可以为数字字面量添加下划线,比如1_000_000。Java编译器会去除这些下划线。
- Java没有无符号(unsigned)形式的 int、long、short或byte类型。
🧐 C和C++中的整型位数
- 16位系统:通常,int是16位(2字节),long是32位(4字节)。
- 32位系统:在许多32位系统(如Windows和Unix)上,int和long都是32位(4字节)。
- 64位系统:在64位系统上,int通常是32位(4字节),但long的大小可能因系统而异。在Unix和Unix-like系统(如Linux和macOS)上,long通常是64位(8字节),这被称为LP64或4/8/8模型1。然而,在Windows上,long仍然是32位(4字节),这被称为LLP64或4/4/8模型。
(AI 回答)
3.3.2 浮点类型
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约 ±3.4x10^38(6~7位有效数字) |
double | 8字节 | 大约 ±1.79x10^308(15位有效数字) |
- 很少情况使用float类型
- float类型的数值后有个后缀F或f;没有后缀F的浮点类型总是默认为double类型。在double类型后加上D或d是可选的。
- 浮点数计算可能的出错情况:
- 正无穷大
- 负无穷大
- NaN (不是一个数)
🚨 **如何判断一个数是否等于 Double.NaN **
if (x == Double.NaN) // is never true ,因为所有的NaN的值都认为是不同的 if (Double.isNaN(x)) // check whether x is "not a number"
3.3.3 char类型
- char 类型的字面量要用单引号
'A'
括起来。
这里涉及到字节编码的问题,未给出解释[?]
3.3.4 boolean 类型
boolean类型有两个值:false
和true
。整型值和布尔值之间不能相互转换。
🚨 在C++中,数值甚至指针都可以代替布尔值。0或者nullptr相当于false,非0或者非nullptr相当于true。在Java中均不成立。
3.4 变量与常量
3.4.1 变量
-
在Java中,
全局变量
(也称为成员变量或字段)和静态变量在声明时可以不进行初始化,系统会根据它们的数据类型自动赋予默认值。而局部变量
(在方法或代码块中声明的变量)必须在使用前进行初始化。 -
在Java10开始,可以使用关键字var而无需指明类型。
var greeting = "hello"; // greeting is a String
-
C/C++区别变量的声明和定义,例如:
int i = 10; // 这是一个定义 extern int i; // 这是一个声明
在Java中,不区别变量的声明和定义。
3.4.2 常量
- 在Java中,使用关键字
final
指示常量。使用final的变量只能被赋值一次。 - 创建一个常量以便在类的多个方法中使用,这些常量称为类常量,可以使用关键字
static final
设置。 const
是Java保留的关键字,目前并未被使用
3.4.3 枚举类型
示例:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
3.5 运算符
- 🚨 Java中不适用
逗号运算符
,这一点与C++不同。
3.5.1 算数运算符
Java中的除法与C++很相似,如果两个操作数都为整数时,/
表示整数除法,否则,表示浮点数除法。
3.5.2 数学函数与常量
- 在Java中,没有完成幂运算的运算符。(C++也木有,Python有两个
**
表示幂运算)
这里还有很多需要注意的问题,比如 n % 2,当n为负数时,使用floorMod方法进行处理;静态导入import static java.lang.Math.*
而使用sqrt(PI)
;溢出会报错的Math.multiplyExact
等,这里没有过多解释。
3.5.3 数值类型之间的转换
3.5.4 强制类型转换
- 一个强制类型转换的例子:
int nx = (int) x;
- 如果想舍入一个浮点数来得到最接近的整数,可以使用
Math.round()
方法。 - 不要想着使用强制类型转化将boolean类型与数值类型转换,就算有需要,请使用
b ? 1 : 0
。
3.5.5 赋值和自增自减运算符
和C++相同,支持类似于x += 4
、n++
等,不再赘述。
3.5.6 关系、boolean运算符、条件运算符
和C++相同,不再赘述。
3.5.7 switch 表达式(Java12、14增添功能)
格式:
int num = switch (season)
{
case "", "", "" -> 6;
case "" -> 5;
default: -1;
}
从Java 12开始,引入了一种新的switch表达式,它使用箭头
->
来代替冒号:
。在这种情况下,你不需要使用break
语句。从Java14开始,switch表达式可以返回值。
3.5.8 位运算符
支持&(and)
、|(or)
、^(xor)
、~(not)
,支持使用>>
和<<
进行左移和右移。
>>
和<<
与C++有差异 [?]