class SetType{
int i;
public SetType(int n){i=n}
public boolean equals(Object o){
return o instanceof SetType && (i==((SetType)o).i);
}
}
在return 语句中((SetType)o).i为什么通过这样的类型转化才能够引用i?
1、首先equals方法属于java.lang.Object,子类需要覆盖该方法,按照覆盖规则,你必须public boolean equals(Object o) 按照这个格式进行覆盖;从而实现多态;
2、你的equals方法实现的不对,equals方法在覆盖时必须满足如下特性(直接引自javadoc): 自反性、对称性、传递性、一致性(幂等性):
[quote]public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
[/quote]
3、实现:
[code="java"]public boolean equals(Object o){
if(this == o) { //一致性 自己和自己比较为true
return true;
}
if(o == null) {//对于任何非空引用值 x,x.equals(null) 都应返回 false。
return false;
}
if(!(o instanceof SetType)) { //类型不兼容 直接返回false
return false;
}
SetType st = (SetType)o; // 把o(Object类型)强制造型为SetType类型,否则获取不到SetType中的成员(Object是所有类型的父类型、提供了几个共性方法(如toString、equals、hashCode) 为所有对象继承 可以参考jdk文档);
if(this.i == st.i) {
return true;
}
return false;
}
[/code]
4、可以自己测试自反性、对称性、传递性、一致性。
在return 语句中((SetType)o).i为什么通过这样的类型转化才能够引用i?
答:首先,o是参数变量,类型为Object,没有i的属性。其次这个equals方法是比较SetType的i属性,而equals方法覆盖父类Ojbect的equals方法,参数固定为Object类型。
o是Object类型,需要调用的i在SetType里面。所以必须要转换后才能调用i。
因为在这个创建下 i是SetType才有的