《Effective Java》(03):类和接口

本篇为《Effective Java》读书笔记系列03(多图预警!)。

笔记

13

14,15

16,17

18,19

20,21,22

补充

条目13

再一次提到了前面关于clone()的内容,放代码以窥之:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Clone_Array {
Apple[] a = new Apple[]{new Apple()};
Apple[] b = a.clone();
public static void main(String[] args) {
Clone_Array ca = new Clone_Array();
ca.b[0].o.a = 7;
System.out.println(ca.a[0].o.a);
}
}
class Apple {
int a = 1;
int b = 2;
Orange o = new Orange();
}
class Orange {
int a = 3;
int b = 4;
}

从这段代码输出为7,可以看出:1.第三行克隆语句不需要强制转换;2.Apple并不需要实现Cloneable接口;3.当深层次修改数组a(也就是修改数组a中索引为0的元素内引用的Orange对象的成员变量a),克隆数组b中的相应数据仍然更改了。也就是单纯的clone仍然是浅拷贝。看下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Clone_Array {
private static final Apple[] a = new Apple[]{new Apple()};
public static final Apple[] values() {
return a.clone();
}
static Apple[] getA() {
return a;
}
public static void main(String[] args) {
Apple newApple = new Apple();
newApple.o.a = 7;
Apple[] b = values();
b[0] = newApple;
System.out.println(b[0].o.a);
System.out.println(getA()[0].o.a);
}
}
class Apple {
int a = 1;
int b = 2;
Orange o = new Orange();
}
class Orange {
int a = 3;
int b = 4;
}

第一行输出为7,第二行输出为3。也就是避免了长度非零的数组可变所带来的安全漏洞。