5.2 Object:所有类的超类

如果没有明确的指出超类,Object就被认为是这个类的超类。

Object类型的变量只能用于作为各种值的通用持有者。要相对其中的内容进行具体的操作,还需要清楚对象的原始类型,并进行相应的类型转换。

在Java中只有基本类型不是对象,如数值、字符和布尔。

5.2.1 equals方法

如果两个对象的状态都相等,就认为这两个对象是相等的。

子类定义equals方法时,先调用超类的equals。如果检测失败,对象就不可能相等。如果超类中的域都相等,就需要比较子类中的实例域。
Objects.equals(xx,yy);

5.2.2相等测试与继承

如何编写一个完美的 equals()方法的建议:
  • 显式参数命名为otherObject,稍后需要将它转换为另一个叫做other的变量。
  • 检测this与otherObject是否引用同一个对象。
     if(this == otherObject) return true;
    
  • 检测 otherObject是否为null,如果为null,则返回false。
    if(otherObject == null) return false;
    
  • 比较this与otherObject 是否属于同一个类。如果equals的语义在每个子类中有所改变,就是用getClass检测:
    if(getClass() != otherObject.getClass()) return false;
    
    如果所有的子类都拥有统一的子类就使用instanceof检测:
    if(!(otherObject instanceof ClassName)) return false;
    
  • 将otherObject转换为响应的类类型变量。
    ClassName other = (ClassName)otherObject;
    
  • 比较域,使用 == 比较基本类型域,使用equals比较对象域。如果所有的域都匹配返回true,否则返回false。
    return field1 == other.field1 && Objects.equals(field2,other.field2);
    
    如果在子类中重新定义了equals方法,就要在其中包含调用super.equals(this)。

对于数组使用Arrays.equals();

对于equals方法要求覆盖Object类的equals(Object others)方法。@Override

5.2.3 hashCode方法

散列码(hash code)是由对象导出的一个整型值;

字符串(String)的散列码是由内容导出的。StringBuffer类中没有定义hashCode方法,它的散列码由Object类默认hashCode方法导出的对象存储地址。

    StringBuilder sb = new StringBuilder();
    StringBuilder stringBuilder = sb;
    System.out.println(stringBuilder.hashCode() +"\t" + sb.hashCode());
    //引用同一个对象,hashCode相等。

Objects.hashCode(yy);
Objects.hashCode(name,salary,hireDay)
如果重新定义equals方法,就必须重新定义hashCode方法。

如果x.equals(y)返回true,那么x.hashCode()就必须与y.hashCode()具有相同的值。

5.2.4toString方法

通过getClass().getName()获取当前类的类名。

如果超类使用了getClass().getName(),那么子类只需要调用super.toString()就可以了。

    public abstract class A {
    private int id;

    @Override
    public String toString() {

        return getClass().getName() + "[ id = " + id + "]";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
public class B extends A{
    private String name;

    public B(){

    }
    public B(int id,String name){
        this.name = name;
        super.setId(id);
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {

        return super.toString() + "[name = " + name + "]";
    }
}
B b = new B(2,"抱抱宝贝");
// A a = new A();
System.out.println(b.toString());
//输出
com.example.demo.entity.B[ id = 2][name = 抱抱宝贝]

只要对象与一个字符串通过操作符"+"连接起来,Java编译器就会自动调用toString()方法。

数组调用toString方法 Arrarys.toString(arrary);

int [] luckyNumber = {1,4,6,7,2};
System.out.println(String.valueOf(luckyNumber).toString());//错误
System.out.println(Arrays.toString(luckyNumber));//正确

toString() 非常有用的调试工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值