1 //不可变类举例:
2 /*
3 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量,
4 且这个引用类是可变类,所以导致Person类也变成了可变类。
5 */
6 class Name1
7 {
8 private String firstName;
9 private String lastName;
10 public Name1(){}
11 public Name1(String firstName,String lastName)
12 {
13 this.firstName = firstName;
14 this.lastName = lastName;
15 }
16 public void setFirstName(String firstName){this.firstName = firstName;}
17 public String getFirstName(){return firstName;}
18 public void setLastName(String lastName){this.lastName = lastName;}
19 public String getLastName(){return lastName;}
20 }
21 public class Person
22 {
23 private final Name1 name;//Person类的引用类型成员变量
24 public Person(Name1 name)
25 {
26 this.name = name;
27 }
28 public Name1 getName()
29 {
30 return name;
31 }
32 public static void main(String[] args)
33 {
34 Name1 n = new Name1("悟空","孙");
35 Person p = new Person(n);
36 //Person对象的name的firstName值为“悟空”
37 System.out.println(p.getName().getFirstName());
38 System.out.println(p.getName().getLastName());
39 //改变Person对象的name的firstName值为“八戒”
40 n.setFirstName("八戒");
41 System.out.println();
42 //Person对象的name的firstName的值被改为“八戒”
43 System.out.println(p.getName().getFirstName());
44 System.out.println(p.getName().getLastName());
45 }
46 }
1 //不可变类举例:
2 /*
3 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量,
4 且这个引用类是可变类,所以导致Person类也变成了可变类。(这个例子保护了Person对象的
5 引用类型的成员变量:name,让Person类成为一个真正的不变类)
6 */
7 class Name1
8 {
9 private String firstName;
10 private String lastName;
11 public Name1(){}
12 public Name1(String firstName,String lastName)
13 {
14 this.firstName = firstName;
15 this.lastName = lastName;
16 }
17 public void setFirstName(String firstName){this.firstName = firstName;}
18 public String getFirstName(){return firstName;}
19 public void setLastName(String lastName){this.lastName = lastName;}
20 public String getLastName(){return lastName;}
21 }
22 public class Person1
23 {
24 private final Name1 name;//Person类的引用类型成员变量
25 public Person1(Name1 name)
26 {
27 //设置name实例变量为临时创建的Name对象,该对象的firstName和LastName
28 //与传入的name参数的firstName和lastName相同
29 this.name = new Name1(name.getFirstName(),name.getLastName());
30 }
31 public Name1 getName()
32 {
33 //返回一个匿名对象,该对象的firstName和lastName
34 //与该对象的name的firstName和LastName相同.
35 return new Name1(name.getFirstName(),name.getLastName());
36 }
37 public static void main(String[] args)
38 {
39 Name1 n = new Name1("悟空","孙");
40 Person1 p = new Person1(n);
41 //Person对象的name的firstName值为“悟空”
42 System.out.println(p.getName().getFirstName());
43 System.out.println(p.getName().getLastName());
44 //改变Person对象的name的firstName值为“八戒”
45 n.setFirstName("八戒");
46 System.out.println();
47 //Person对象的name的firstName的值被改为“八戒”
48 System.out.println(p.getName().getFirstName());
49 System.out.println(p.getName().getLastName());
50 }
51 }
1 /*
2 不可变(immutable)类:的意思是创建该类的失利后,该实例的实例变量是不可改变的。
3 Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例变量不可改变。
4
5 */
6
7 //测试Java.lang.String类的equals()方法和hashCode方法()
8 public class ImmutableStringTest
9 {
10 public static void main(String[] args)
11 {
12 String str1 = new String("Hello");
13 String str2 = new String("Hello");
14 System.out.println(str1 == str2);
15 System.out.println(str1.equals(str2));
16 //下面两次输出hashCode相等
17 System.out.println(str1.hashCode());
18 System.out.println(str2.hashCode());
19 }
20 }