《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的一部分。

JDK版本


另外,OpenJDK是Java SE 的一个免费开源实现;LTS(Long Term Support)是长期支持版本。


2.1.2 设置 JDK

需要配置环境变量路径,此步骤省略。


2.2 使用命令行执行Java程序

  1. 打开终端,cd到java文件目录下

  2. 输入命令

    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!'");
   }
}

分析如下:

image-20230925042644124


3.2 注释

⭐注释总共有三种:///* *//** */ ( 用于生成文档注释 )



3.3 数据类型

  • Java是一种强类型语言。
  • Java中有8种基本类型,其中有4种整型 int、short、long、byte2种浮点类型 float、double1 种字符类型char1 种表示真值boolean

3.3.1 整型

类型 存储需求 取值范围
int 4字节 -2147483648 ~ 2147483647
short 2字节 -32768 ~ 32767
long 8字节 -9223372036854775808 ~ 9223372036854775808
byte 1字节 -128 ~ 127
  • 通常情况下使用int
  • 各种数据类型的取值范围是固定的
  • 长整型有个后缀Ll。十六进制有个前缀0x0X。八进制前有个前缀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类型有两个值:falsetrue。整型值和布尔值之间不能相互转换。

🚨 在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 += 4n++等,不再赘述。


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++有差异 [?]




posted @ 2023-09-24 17:31  vLiion  阅读(75)  评论(0编辑  收藏  举报