Java中的equals和强制类型转换

来源:互联网 发布:实验室洗眼器 淘宝 编辑:程序博客网 时间:2024/05/17 21:53

我们通常是用“==”是比较的两个对象的内存地址,两个对象的内存地址是否相等,但是有些时候我们的比较是对两个对象的内容进行比较,所以使用object的equals方法就不可以了,实际上在JDK中,String和Math等类都对equals方法进行了重写,所以这些类中的比较就是对其内容的比较了。


使用equls的几个性质

1、自反性:对于任何的非空值x,x.equals(x)都是返回的true

2、对称性:非空引用x和y,x.equals(y)返回true有y.equals(x)返回true

3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。


选择合适的比较方式

值得注意的是float和double的比较需要特定的方式

1) 对象域,使用equals方法 。 
2) 类型安全的枚举,使用equals或== 。
3) 可能为null的对象域 : 使用 == 和 equals 。
4) 数组域 : 使用 Arrays.equals 。
5) 除float和double外的原始数据类型 : 使用 == 。
6) float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。
7) double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。


在equals()中使用getClass进行类型判断

instanceof是判断一个类是否是这个类的子类,而getClass是获得一个类的运行时对象,当使用equals时,因为容易以为继承的关系,将两个不相同但是具有继承关系的类归为一类。但是getClass就不会有这样的错误。
package TwoWeek;public class Equal {public static void main(String args[]){        Student e2 = new Student("chenssy");          Person p1 = new Person("chenssy");          System.out.println(p1.equals(e2));  }}class Person{private String name;public Person(String name){this.name = name;}    public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }  public boolean equals(Object object){          if(object.getClass() == Person.class){          // 上面如果使用if(object instanceof Person)结果就会是true了            Person p = (Person) object;              if(p.getName() == null || name == null){                  return false;              }              else{                  return name.equalsIgnoreCase(p.getName());                  //将String与另一个String比较,不考虑大小写            }          }          return false;      } }class Student extends Person{      public Student(String name){          super(name);        } }  

强制类型转换
我们知道在java的继承中,子类可以转换成父类,并且该过程会丢失掉一些属性,该过程不需要进行强制类型的转换,但是父类转换成子类的时候就不行了,必须进行强制类型的转换,但是父类转换成子类是否一定就能成功呢,答案是否定的。
当我们使用类型构造器构造出一个对象的时候,那么这个对象的类型也就是确定的了,其实其本质上是不会发生变化的了;
请看下面的例子:
Father father = new Son;其中Son是继承自Father的,所以说Son具有更多的属性,这是向上转型,本质上还是Son类型,但是被削弱了,这是可行的。那下面我们将其还原为强类型。
Son son = (Son) father; 这句是可行了,因为father的本质是Son类型的,这句只不过是将其恢复真身而已。
那么什么情况下会出错呢,当其本质是Father类型的时候就会出错。如下:
Father father = new Father();
Son son = (Son) father; 
这样就会出错了,因为本身是father类型的,没有Son的属性。
所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。


1 0
原创粉丝点击