equals的编写规则 有几个概念没有看懂.

图片说明

1.如果语义在每个子类中有所改变,就使用getClass检测,如果所有的子类都拥有统一的语义
就使用getClass检测.
什么叫做语义所有改变和有统一的语义.
2.什么叫基本类型域.

1.意思是说比较的两个子类是否有继承关系 例如A extends B 那么A和B有统一的语义B
2.基本类型域是指String ,long,int,class,数组,集合等等

1.如果语义在每个子类中有所改变,就使用getClass检测,如果所有的子类都拥有统一的语义
就使用instanceof检测.
什么叫做语义所有改变和有统一的语义.

举个例子:
B extends A
C extends A
B,C的equals方法不同。

public class A {
private int a;

public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof A))
        return false;

    if(a != ((A)o).a) {
        return false;
    }

    return true;
}

}

public class B extends A {
private int b;

public B(int para) {
    b = para;
}

public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof A))   //此处的校验过于宽松会导致后续的类型转换报错
        return false;

    if(b != ((B)o).b) {       // 如果传入的实例是C的对象,此处会抛出异常
        return false;
    }

    return true;
}

}

改为getClass判断才行:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(getClass() != o.getClass()) //如果传入C的实例对象,此处就会返回false,达到正常比对的目的
return false;

    if(b != ((B)o).b) {       
        return false;
    }

    return true;
}

2.什么叫基本类型域.
基本类型:指的是像int,float等基本的数据类型,可以直接用==来判断是否相等;
基本类型域:就是那些类型为基本类型的成员变量

还有一个问题就是我在主函数中实例其他类的对象吗,我一直觉得很奇怪。