java · 2023-11-27 0

《Java核心技术·卷I》读书笔记02


对象与类

使用预定义类

对象与类对象

要想使用对象,必须先构造对象,并指定其初始状态,然后对对象应用方法

构造器构造新实例

Java类库中的LocalDate类

Data类:表示时间点 LocalDate类: 用日历表示法表示日期

谁不要使用构造器来构造LocalDate类的对象,应当使用静态工厂方法

用户自定义类

最常用的类定义为:

Employee类

以下是一个简单的Employee类及其使用

构造器

在构造类对象时,构造器会运行,从而将实例字段初始化为所希望的初始状态

总是结合new运算符来调用,不能对一个已经存在的对象调用构造器来达到重新设置实例字段的目的

  • 构造器与类同名
  • 每个类可以有一个以上的构造器
  • 构造器可以有0个,一个或多个参数
  • 构造器没有返回值
  • 构造器总是伴随着new操作符一起调用

注意:

不要在构造器中定义与实例字段同名的局部变量,如,下面的构造器将不会设置salary

用var声明局部变量

在Java10中,如果可以从变量的初始值推导出它们的类型,可以使用var关键字声明局部变量,无需指定类型

可以不这么声明:

只需要写以下代码:

只能用于方法中的局部变量!参数和字段的类型必须声明

使用null引用

如果对null值应用一个方法,会产生一个NullPointerException异常。

这是一个非常严重的错误

定义一个类时,最好要清楚哪些字段可能为null

在java9中,objects类对此提供了一个便利方法

隐式参数与显式参数

对于raiseSalary方法,    

有两个参数,第一个为隐式参数,是出现在方法名前的Employee的对象,没有出现在方法声明中 第二个参数是显示参数,是位于方法名后面括号中的数值

在每一个方法中,关键字this指示隐式参数

可以如下改写raiseSalary方法    

final实例字段

final字段必须在构造对象时初始化。要确保在每一个构造器执行之后,这个字段的值已经设置,并且以后不能再修改这个字的

final关键字表示存储在evaluations变量中的对象不会再指示另一个不同的StringBuilder对象。但这个对象可更改。

静态字段与动态字段

静态字符

如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例字段每个对象都有自己的一个副本。

每一个Employee 对象都有一个自己的id字段,但这个类的所有实例将共享一个nextId 即使没有Employee对象,静态字段nextId也存在

静态常量

静态方法

静态方法是不在对象上执行的方法,可以认为是没有this参数的方法。

如Math类的pow方法:Math.pow(x, a)。在完成运算时,不使用任何Math对象。

在下面两种情况下可以使用静态方法:

  • 方法不需要访问对象状态,(因为它需要的所有参数都通过显式参数提供)
  • 方法只需要访问类的静态字段

main方法

main方法也是一个静态方法

main方法不对任何对象进行操作,它将执行并构造程序所需要的对象

每一个类可以有一个main方法,这是常用于对类进行单元测试的一个技巧

若Employee类有一个静态的main方法,可用java Employee执行main方法

方法参数

按值调用 — 按引用调用

java总是采用按值调用

交换两数a, b的错误方法:

在java中方法参数能做什么、不能做什么

  1. 不能修改基本数据类型的参数(数值型/布尔型),如下tripleValue()
  2. 可以改变对象参数的状态,如下 tripleSalary()
  3. 不能让一个对象参数引用一个新的对象

对象构造

重载

类可以有多个构造器,

编译器必须选出具体调用哪个方法。它用各个方法首部中的参数类型与特定方法调用中所使用的值类型进行匹配,来选出正确的方法。 如果编译器找不到匹配的参数,就会产生编译错误

默认字段初始化

类中没有初始化的字段会自动初始化为默认值(不建议!)

无参数的构造器

由无参数构造器创建对象时,对象的状态会设置为适当的默认值。

如果写一个类时没有其他编写构造器,就会提供一个无参数构造器,将实例字段设置为初始值

如果类中提供了至少一个构造器,但没有提供无参数的构造器,那么构造对象时如果不提供参数是不合法的

显式字段初始化

可以在类定义里面直接为任何字段赋值

初始值不一定是常量值,也可以使用下列方式进行初始化

调用另一个构造器

如果构造器的第一个语句形如this(…),这个构造器将调用同一个类的另一个构造器

初始化块

第三种初始化数据字段的方法

在一个类的声明中,可以包含任意多个代码块。只要构造这个类的对象,这些块就会被执行

在这个示例中,无论使用哪个构造器构造对象,id字段都会在对象初始化块中初始化,并且先运行初始化块,再运行构造器的主体部分

构造器的具体处理步骤

  1. 如果构造器的第一行调用了另一个构造器,则基于所提供参数执行第二个构造器
  2. 否则 a) 所有数据字段初始化为其默认值(0、false 或 null) b) 按照在类声明中出现的顺序,执行所有字段初始化方法和初始块
  3. 执行构造器主体代码

包名

使用包的主要原因是确保类名的唯一性

类的导入

一个类可以使用所属包中的所有类,以及其他包的公共类

静态导入

有一种import语句允许导入静态方法和静态字段

例如,如果在源文件顶部添加一条指令:

就可以使用System类的静态方法和静态字段,不必加类名前缀

另外,还可以导入特定的方法或字段