元数据

Java核心技术第10版(套装共2册)

  •  Java核心技术第10版(套装共2册)|200
  • 书名: Java核心技术第10版(套装共2册)
  • 作者: 凯S.霍斯特曼 霍斯特曼 科内尔
  • 简介: 《Java核心技术 卷Ⅰ 基础知识(原书第10版)》本书是《Java核心技术》第10版的卷Ⅰ。自《Java核心技术》出版以来,每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了部分内容,以便适应Java的最新特性。在这一版中,已经反映了Java标准版(Java SE 8)的特性。与前几版一样,本版仍然将读者群定位在那些打算将Java应用到实际工程项目中的程序设计人员。本书假设读者是一名具有程序设计语言(除Java之外)坚实背景知识的程序设计人员,并且不希望书中充斥着玩具式的示例(诸如,烤面包机、动物园的动物或神经质的跳动文本)。这些内容绝对不会在本书中出现。本书的目标是让读者充分理解书中介绍的Java语言及Java类库的相关特性,而不会产生任何误解。在本书中,我们选用大量的示例代码演示所讨论的每一个语言特性和类库特性。我们有意使用简单的示例程序以突出重点,然而,其中的大部分既不是赝品也没有偷工减料。它们将成为读者自己编写代码的良好开端。
  • 出版时间 2019-12-20 00:00:00
  • ISBN:
  • 分类: 计算机-编程设计
  • 出版社: 机械工业出版社
  • PC地址:https://weread.qq.com/web/reader/e56324b071a5ee49e56bbae

高亮划线

1.1 Java程序设计平台

📌 Java有许多非常优秀的语言特性,本章稍后将会详细地讨论这些特性。 ⏱ 2020-09-24 22:34:07

1.2 Java“白皮书”的关键术语

📌 它将重点放在数据(即对象)和对象的接口上。 ⏱ 2020-09-24 22:34:59

📌 编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代码可以在许多处理器上运行。 ⏱ 2020-09-24 23:07:37

📌 ,解释虚拟机指令肯定会比全速运行机器指令慢很多。然而,虚拟机有一个选项,可以将执行最频繁的字节码序列翻译成机器码,这一过程被称为即时编译。 ⏱ 2020-09-24 23:08:51

📌 Java中的int永远为32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。唯一的限制只是int类型的大小不能低于short int,并且不能高于long int。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。 ⏱ 2020-09-24 23:09:49

📌 即时编译器可以监控经常执行哪些代码并优化这些代码以提高速度。 ⏱ 2020-09-24 23:18:14

📌 多线程可以带来更好的交互响应和实时行为。 ⏱ 2020-09-24 23:18:23

📌 我们非常关注并发性 ⏱ 2020-09-24 23:18:26

📌 而是着眼于获得更多的处理器 ⏱ 2020-09-24 23:18:31

📌 Java在当时很超前。它是第一个支持并发程序设计的主流语言。 ⏱ 2020-09-24 23:18:41

📌 ,Java与C或C++相比更加具有动态性 ⏱ 2020-09-24 23:18:49

1.3 Java applet与Internet

📌 用户从Internet下载Java字节码,并在自己的机器上运行 ⏱ 2020-09-25 00:06:44

📌 在网页中运行的Java程序称为applet。要使用applet,需要启用Java的Web浏览器执行字节码 ⏱ 2020-09-25 00:06:32

📌 在网页中插入一个applet就如同在网页中嵌入一幅图片。applet会成为页面的一部分。 ⏱ 2020-09-25 00:06:53

📌 不同版本的Netscape与InternetExplorer运行不同版本的Java,其中有些早已过时。这种糟糕的情况导致更加难于利用Java的最新版本开发applet。 ⏱ 2020-09-25 00:07:26

1.5 关于Java的常见误解

📌 像Java这种功能强大的语言大都不太容易学习 ⏱ 2020-09-25 01:37:21

📌 首先,必须将编写玩具式程序的轻松和开发实际项目的艰难区分开来。 ⏱ 2020-09-25 01:37:26

📌 幸运的是,并不需要知道它们中的每一个,然而,要想Java解决实际问题,还是需要了解不少内容的。 ⏱ 2020-09-25 01:37:31

2.2 使用命令行工具

📌 javac程序是一个Java编译器。它将文件Welcome.java编译成Welcome.class。java程序启动Java虚拟机。虚拟机执行编译器放在class文件中的字节码。 ⏱ 2020-09-25 02:32:03

📌 ·如果手工输入源程序,一定要注意大小写。 ⏱ 2020-09-25 02:32:16

📌 编译器需要一个文件名(Welcome.java),而运行程序时,只需要指定类名(Welcome),不要带扩展名.java或.class。 ⏱ 2020-09-25 02:32:19

2.5 构建并运行applet

📌 applet要在浏览器中查看。遗憾的是,现在很多浏览器并不提供Java支持,或者启用Java很困难。对此,最好使用Firefox。 ⏱ 2020-09-25 11:35:56

3.1 一个简单的Java应用程序

📌 关键字public称为访问修饰符(access modifier),这些修饰符用于控制程序的其他部分对这段代码的访问级别 ⏱ 2020-04-16 17:39:21

📌 标准的命名规范为(类名FirstSample就遵循了这个规范):类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该大写(这种在一个单词中间使用大写字母的方式称为骆驼命名法。以其自身为例,应该写成CamelCase)。 ⏱ 2020-04-16 17:39:45

📌 源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。 ⏱ 2020-04-16 17:39:48

📌 根据Java语言规范,main方法必须声明为public ⏱ 2020-04-16 18:00:37

3.3 数据类型

📌 在Java中,一共有8种基本类型(primitive type),其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1种用于表示真值的boolean类型。 ⏱ 2020-04-16 18:14:52

📌 在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。 ⏱ 2020-04-16 18:19:28

📌 从Java 7开始,加上前缀0b或0B就可以写二进制数。 ⏱ 2020-04-16 18:19:59

📌 同样是从Java 7开始,还可以为数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下划线。 ⏱ 2020-04-16 18:20:27

📌 Java没有任何无符号(unsigned)形式的int、long、short或byte类型。 ⏱ 2020-04-16 18:20:17

📌 double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值) ⏱ 2020-04-16 18:26:10

📌 绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。实际上,只有很少的情况适合使用float类型,例如,需要单精度数据的库,或者需要存储大量数据。 ⏱ 2020-04-16 18:26:21

📌 float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。当然,也可以在浮点数值后面添加后缀D或d(例如,3.14D)。 ⏱ 2020-04-16 18:26:22

📌 ·正无穷大 ·负无穷大 ·NaN(不是一个数字) ⏱ 2020-04-16 18:27:02

📌 Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(以及相应的Float类型的常量)分别表示这三个特殊的值, ⏱ 2020-04-16 18:26:46

📌 所有“非数值”的值都认为是不相同的。然而,可以使用Double.isNaN方法:  ⏱ 2020-04-16 18:26:57

📌 char类型原本用于表示单个字符。 ⏱ 2020-04-23 23:07:07

📌 要想弄清char类型,就必须了解Unicode编码机制。Unicode打破了传统字符编码机制的限制。 ⏱ 2020-04-23 23:07:20

📌 。这样就产生了下面两个问题:一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字符集的语言其编码长度有可能不同。 ⏱ 2020-04-23 23:07:28

📌 设计Unicode编码的目的就是要解决这些问题。 ⏱ 2020-04-23 23:07:33

📌 我们强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理(有关这方面的内容将在3.6节讨论) ⏱ 2020-04-23 23:20:13

3.4 变量

📌 在Java中,利用关键字final指示常量。 ⏱ 2020-04-23 23:46:58

📌 关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。 ⏱ 2020-05-01 13:59:39

📌 关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。 ⏱ 2020-04-23 23:47:02

📌 在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。 ⏱ 2020-04-23 23:47:17

📌 可以使用关键字static final设置一个类常量。 ⏱ 2020-05-01 13:59:39

📌 类常量的定义位于main方法的外部。 ⏱ 2020-04-23 23:54:15

📌 const是Java保留的关键字,但目前并没有使用。在Java中,必须使用final定义常量。 ⏱ 2020-04-23 23:54:24

3.5 运算符

📌 数值计算 ⏱ 2020-04-24 15:52:59

📌 但是,对于使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。例如,可以把main方法标记为 ⏱ 2020-04-24 15:52:56

📌 在main方法中的所有指令都将使用严格的浮点计算。如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算。 ⏱ 2020-04-24 15:53:15

📌 对大多数程序来说,浮点溢出不属于大问题。在本书中,将不使用strictfp关键字。 ⏱ 2020-04-24 16:28:02

📌 图3-1 数值类型之间的合法转换 ⏱ 2020-04-24 19:12:58

3.6 字符串

📌 可以使用equals方法检测两个字符串是否相等。对 ⏱ 2020-09-25 12:33:46

📌 要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。 ⏱ 2020-09-25 12:33:52

📌 一定不要使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上 ⏱ 2020-09-25 12:33:59

📌 空串""是长度为0的字符串 ⏱ 2020-09-25 12:38:26

📌 空串是一个Java对象,有自己的串长度(0)和内容(空)。 ⏱ 2020-09-25 12:38:30

📌 每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。 ⏱ 2020-09-25 12:46:35

📌 如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器: ⏱ 2020-09-25 12:46:40

📌 当每次需要添加一部分内容时,就调用append方法。 ⏱ 2020-09-25 12:46:44

📌 在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。 ⏱ 2020-09-25 12:46:53

3.7 输入输出

📌 要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。 ⏱ 2020-09-25 12:53:53

📌 现在,就可以使用Scanner类的各种方法实现输入操作了。例如,nextLine方法将输入一行。 ⏱ 2020-09-25 12:56:13

📌 要想读取一个单词(以空白符作为分隔符) ⏱ 2020-09-25 12:56:24

📌 Scanner类定义在java.util包中。当使用的类不是定义在基本java.lang包中时,一定要使用import指示字将相应的包加载进来。 ⏱ 2020-09-25 12:54:33

📌 Java SE 5.0沿用了C语言库函数中的printf方法。 ⏱ 2020-09-25 12:59:18

📌 要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名: ⏱ 2020-09-25 13:17:36

📌 但这个Scanner将字符串解释为数据,而不是文件名 ⏱ 2020-09-25 13:16:52

📌 可以使用下面的调用方式找到路径的位置: ⏱ 2020-09-25 13:17:01

📌 要记住一点:如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。Java编译器认为这些异常比“被零除”异常更严重。 ⏱ 2020-09-25 13:17:22

3.9 大数值

📌 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。 ⏱ 2020-05-03 22:00:19

📌 BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。 ⏱ 2020-05-03 22:00:23

📌 而需要使用大数值类中的add和multiply方法。 ⏱ 2020-05-03 22:00:31

3.10 数组

📌 允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组: ⏱ 2020-09-29 00:51:01

📌 图3-14显示了拷贝的结果。如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法: ⏱ 2020-05-03 22:09:58

📌 如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。 ⏱ 2020-05-03 22:09:51

📌 Java中的[]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过a加1得到数组的下一个元素。 ⏱ 2020-09-29 00:55:25

📌 这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的。 ⏱ 2020-05-03 22:17:13

4.1 面向对象程序设计概述

📌 对于一些规模较小的问题,将其分解为过程的开发方式比较理想。而面向对象更加适用于解决规模较大的问题。要想实现一个简单的Web浏览器可能需要大约2000个过程,这些过程可能需要对一组全局数据进行操作。采用面向对象的设计风格,可能只需要大约100个类,每个类平均包含20个方法(如图4-1所示) ⏱ 2020-09-30 16:23:40

📌 封装(encapsulation,有时称为数据隐藏)是与对象有关的一个重要概念。从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。 ⏱ 2020-05-16 10:45:42

📌 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。 ⏱ 2020-05-16 10:45:59

📌 扩展一个已有的类时,这个扩展后的新类具有所扩展的类的全部属性和方法。在新类中,只需提供适用于这个新类的新方法和数据域就可以了。通过扩展一个类来建立另外一个类的过程称为继承(inheritance), ⏱ 2020-05-16 10:47:54

📌 ·对象的行为(behavior)——可以对对象施加哪些操作,或可以对对象施加哪些方法? ·对象的状态(state)——当施加那些方法时,对象如何响应? ·对象标识(identity)——如何辨别具有相同行为与状态的不同对象? ⏱ 2020-05-16 10:51:09

📌 对象状态的改变必须通过调用方法实现(如果不经过方法调用就可以改变对象状态,只能说明封装性遭到了破坏)。 ⏱ 2020-05-16 10:51:25

📌 识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。 ⏱ 2020-05-16 10:55:15

📌 在类之间,最常见的关系有·依赖(“uses-a”)·聚合(“has-a”)·继承(“is-a”) ⏱ 2020-09-30 16:49:24

📌 如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。 ⏱ 2020-05-16 10:54:03

📌 应该尽可能地将相互依赖的类减至最少。 ⏱ 2020-05-16 10:54:08

📌 软件工程的术语来说,就是让类之间的耦合度最小。 ⏱ 2020-05-16 10:54:18

📌 聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系。例如,一个Order对象包含一些Item对象。聚合关系意味着类A的对象包含类B的对象。 ⏱ 2020-05-16 10:54:27

📌 继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的 ⏱ 2020-05-16 10:54:35

📌 一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能 ⏱ 2020-05-16 10:55:02

📌 类用矩形表示,类之间的关系用带有各种修饰的箭头表示 ⏱ 2020-05-16 10:56:35

4.2 使用预定义类

📌 并不是所有的类都具有面向对象特征。 ⏱ 2020-05-16 10:57:46

📌 构造器的名字应该与类名相同。 ⏱ 2020-05-16 11:01:55

📌 局部变量不会自动地初始化为null,而必须通过调用new或将它们设置为null进行初始化。 ⏱ 2020-05-16 11:17:43

📌 一个是用来表示时间点的Date类;另一个是用来表示大家熟悉的日历表示法的LocalDate类。 ⏱ 2020-10-01 10:22:57

📌 一旦有了一个LocalDate对象,可以用方法getYear、getMonthValue和getDayOfMonth得到年、月和日: ⏱ 2020-10-03 14:58:21

📌 最好还是不要使用这些废弃不用的方法,因为将来的某个类库版本很有可能将它们完全删除。 ⏱ 2020-05-16 11:28:40

📌 只访问对象而不修改对象的方法有时称为访问器方法 ⏱ 2020-05-16 11:29:16

4.5 方法参数

📌 Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。 ⏱ 2020-05-08 22:34:38

第5章 继承

📌 人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。 ⏱ 2020-05-17 10:15:55

📌 反射是指在程序运行期间发现更多的类及其属性的能力。 ⏱ 2020-05-17 10:16:08

5.1 类、超类和子类

📌 “is-a”关系是继承的一个明显特征。 ⏱ 2020-05-17 10:18:27

📌 关键字extends表示继承。 ⏱ 2020-05-17 10:20:35

📌 已存在的类称为超类(superclass)、基类(base class)或父类(parent class);新类称为子类(subclass)、派生类(derived class)或孩子类(child class)。 ⏱ 2020-05-17 10:24:17

📌 如果Manager类的方法一定要访问私有域,就必须借助于公有的接口,Employee类中的公有方法getSalary正是这样一个接口。 ⏱ 2020-05-17 10:29:14

📌 如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器 ⏱ 2020-05-17 10:39:37

📌 由一个公共超类派生出来的所有类的集合被称为继承层次(inheritance hierarchy) ⏱ 2020-05-17 10:48:36

📌 “is-a”规则的另一种表述法是置换法则。它表明程序中出现超类对象的任何地方都可以用子类对象置换。 ⏱ 2020-05-17 11:02:12

5.4 对象包装器与自动装箱

📌 这种变换被称为自动装箱(autoboxing)。 ⏱ 2020-05-11 11:34:34

5.7 反射

📌 能够分析类能力的程序称为反射(reflective)。 ⏱ 2020-05-11 11:39:48

读书笔记

本书评论