示例程序
1 public final class Address 2 { 3 private final String detail; 4 private final String postCode; 5 6 //在构造方法里初始化两个实例属性 7 public Address() 8 { 9 this.detail = "";10 this.postCode = "";11 }12 public Address(String detail , String postCode)13 {14 this.detail = detail;15 this.postCode = postCode;16 }17 //仅为两个实例属性提供getter方法18 public String getDetail()19 {20 return this.detail;21 }22 23 public String getPostCode()24 {25 return this.postCode;26 }27 //重写equals方法,判断两个对象是否相等。28 public boolean equals(Object obj)29 {30 if (obj instanceof Address)31 {32 Address ad = (Address)obj;33 if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))34 {35 return true;36 }37 }38 return false;39 }40 public int hashCode()41 {42 return detail.hashCode() + postCode.hashCode();43 }44 45 public static void main(String args[])46 {47 Address a = new Address();48 Address b = new Address("dscfd","fghgh");49 50 System.out.println("a:"+a.getDetail()+a.getPostCode()+a.hashCode());51 52 System.out.println("b:"+b.getDetail()+b.getPostCode()+b.hashCode());53 54 System.out.println(a.equals(b));55 }56 }
结果截图
分析:
以final声明的方法不允许覆盖。
以final声明的变量不允许更改。
利用final,我们可以设计出一种特殊的“只读” 的“不可变类”。
创建“不可变的类”的对象后,此对象的属性不可改,而且也无法从此类派生出新子类。String就是一个典型的例子。
不可变的“类”有何用?
可以方便和安全地用于多线程环境中, 访问它们可以不用加锁,因而能提供较高的性能。
JDK中的实例:String