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 }