谈到继承就不得不提起所有类的超类Object类.在java中每一个类都是由他拓展而来.但是不需要显式的写到extends object.如果一个类并没有明确的指出超类是什么,那么这个类就会被认为是object的子类.object类都有哪些用处呢.首先介绍一些比较简单易懂的.首选由于object是所有类的超类,因此我们可以用object类引用任何类型的对象:
Object object = new Employee();
这样做试试完全合法的.在java中,只有基本类型不是对象,其他的引用类型包括数组类型,不管是对象数组还是引用数组都拓展了object类.
下面要介绍的是object类的一些方法:
equals方法:
object中的equals检查的是一个对象的引用是否等于另外一个独享.在object类中,这个方法架构判断的是两个对象的引用是否相等.然而对于多数的类来说,这样的判断并没有太多意义.有时候我们需要通过一些业务逻辑来判断两个类是否相等.就比如我们判断两个雇员是否相等只需要判断他的员工id是否相等就可以,而并不需要判断两个员工是否引用了同一个员工对象.这时我们就需要对object类中的equals方法进行覆写.
例:
@Override
public boolean equals(Object other) {
Employee otherEm = (Employee) other;
return this.id == otherEm.getId();
}
但是我们这么写是不严谨的,为了防止id为null的情况我们需要将这个判断的逻辑进行更加严谨的封装
@Override
public boolean equals(Object other) {
if(this == other ){
return true;
}
if(other != null){
if(getClass()!=other.getClass()) return false;
Employee emp = (Employee) other ;
return id.equals(emp.id);
}
return false;
}
Hashcode方法
散列码(hash code)是由对象导出的一个整形值,散列码是没有规律的,如果x和y是两个对象,x.hashcode()和y.hashcode()基本上不会相同.由于hashcode方法定义在object类中,因此没一个对象都有一个默认的hashcode的值,其值为存储地址值.
例:
String s = "OK";
StringBuilder sb = new StringBuilder();
System.out.println(s.hashCode()+" "+sb.hashCode());
String t = "OK";
StringBuilder tb = new StringBuilder();
System.out.println(t.hashCode()+" "+tb.hashCode());
结果;
2524 30533424
2524 27334345
请注意:字符串s和t拥有相同的散列码是由于字符串的散列码是由内容导出的.而StringBuilder类的sb和tb拥有不同的散列码是由于他们的散列码是对象存储地址.
如果我们重新定义了equals方法 那么我们就应该重新定义hashcode方法 并且两个方法的定义必须一致.
toString方法:
toString方法是object类中的一个重要的方法,它用于返回表示对象值得字符串.绝大多数的toString方法都遵循这样的格式:类的名字,虽有是一对方括号括起来的域值.
例如java.awt.Point[x=1,y=2]
当然我们也可以重写toString方法
例如:
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + ", joinDate=" + joinDate + "]";
}
随处可见toString的原因就是由于只要一个对象与一个字符串通过操作符" + "连接起来,java就会自动的调用toString方法,以便获得这个对象的描述.