Java编程思想读书笔记——初始化与清理(二)

时间:2020-12-29 12:11:54

5.6 成员初始化
1)类的每一个基本数据类型成员,如果不显式赋予初值,都会有一个初始值;
2)对于引用类型成员,如果不显式赋予初值,则其初始值为null。
3)也可以直接在类中,对成员变量直接赋予初值。

5.7 构造器初始化
构造器也可以用于初始化。
5.7.1 初始化顺序
类内部的初始化,要先于构造器中初始化。
5.7.2 静态数据的初始化
静态成员变量的初始化值与非静态成员变量的初始化情形相同。在初始化顺序上,要先于非静态成员变量而初始化,并且一旦被初始化后,其不会再被初始化,即无论利用该类创建多少对象,静态数据都只能有一次初始化。
5.7.3 显式的静态初始化
静态代码块中也可以对静态成员变量进行初始化,且其初始化优先于直接在类中初始化的静态成员变量。

public class Spoon {
static int i;
static {
i = 47;
}
}

静态代码块只执行一次,只有当首次生成该类的第一个对象或者首次访问该类的静态数据时,静态代码块才会被执行。
5.7.4 非静态实例初始化
初始化代码块,可以对非静态成员变量进行初始化,在初始化顺序上要优先于构造器初始化。

public class Spoon2{
int i;
{
i = 47;
}
}

5.8 数组初始化
数组是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
定义(本质是定义一个指向数组的引用)

int[] a; //与 int a[]效果相同

初始化

int[] a = {1, 2, 3, 4, 5};

指定长度

int[] a = new int[5];

所有的数组都有一个固定的成员,即length,表示数组的长度。

可变参数列表
可以定义接收任意个参数(包括零)的方法,这任意个参数将作为数组才传入。

f(Object... args){ //等效于 f(Object[] args)
}

可变参数可以与自动包装机制共存。
可变参数列表可以使得方法重载变得更为复杂。
1) 编译器会使用自动包装机制来匹配重载的方法;

public class OverloadingVarargs {

static void f(Character... args){
for(Character c : args){
System.out.print(" " + c);
}
System.out.println();
}

static void f(Integer... args){
for(Integer i : args){
System.out.print(" " + i);
}
System.out.println();
}

static void f(Long... args){
for(Long l : args){
System.out.print(" " + l);
}
System.out.println();
}

public static void main(String[] args){
f('a', 'b', 'c');
f(1);
f(2, 1);
f(0);
f(0L);
//f(); //无法判断是运行哪一个f方法
}
}

2) 如果在某个方法中增加一个非可变参数的话

public class OverloadingVarargs2 {

static void f(float i, Character... args){
System.out.println("first");
}

static void f(Character... args){
System.out.println("second");
}

public static void main(String[] args){
f(1, 'a');
f('a', 'b'); //无法通过编译,对f的引用不明确
}
}

3) 只能两个方法都加入一个非可变参数

public class OverloadingVarargs3 {

static void f(float i, Character... args){
System.out.println("first");
}

static void f(char c, Character... args){
System.out.println("second");
}

public static void main(String[] args){
f(1, 'a');
f('a', 'b');
}
}

总之,最好只在重载方法的一个版本上使用可变参数列表,或者不在任何一个重载方法上使用。

5.9 枚举类型
enum关键字,是在JDK 5之后加入的特性,主要用于处理常量集。

需要注意的是,在枚举类型中指定多少个常量,内存中就只会存在相应个数的枚举类型实例,每个实例对应于一个常量。

编译器还会自动创建ordinal()方法和values()方法,这两个方法都是静态方法。前者表示枚举类型声明的顺序(可在遍历时,便是按照该顺序遍历),后者生成由这些常量组成的数组。

枚举类型可以用于switch语句中。