Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承对象的Java equals()方法_Java - Fatal编程技术网

继承对象的Java equals()方法

继承对象的Java equals()方法,java,Java,这是我的密码: class Car { Piece doors; Piece window; String name; List<Sign> signs; //??? Car() { } @Override public String toString() { //... } @Override public boolean equals(Object other) {

这是我的密码:

class Car {
    Piece doors;
    Piece window;
    String name;
    List<Sign> signs; //???

    Car() {

    }
    @Override
    public String toString() {
        //...
    }
    @Override
    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        if (other == null || other.getClass() != this.getClass()) {
            return false;
        }
        if (this.doors == other.doors && this.window == other.window ) {
            return true;
        }
        return false;
    }
}

class Piece extends Car {
    Piece() {
        //...

    }
}

class Brand extends Car {

    Brand(String name, Sign[] signs) {
        this.name = name;
        this.signs = signs;
    }

    List<Sign> signs() {
        return this.signs;
    }
}
等级车{
单件门;
片窗;
字符串名;
列出标志;/???
汽车(){
}
@凌驾
公共字符串toString(){
//...
}
@凌驾
公共布尔等于(对象其他){
if(this==其他){
返回true;
}
if(other==null | | other.getClass()!=this.getClass()){
返回false;
}
if(this.doors==other.doors&&this.window==other.window){
返回true;
}
返回false;
}
}
类件延伸车{
件(){
//...
}
}
一流品牌延伸汽车{
品牌(字符串名称,符号[]符号){
this.name=名称;
这个符号=符号;
}
列表标志(){
把这封信还给我;
}
}

这是我的班级结构。现在,我想知道,两个比较对象是否相等。假设我们有两件物品。如何在方法Car.equals()中比较它们?这里的问题是如何找到该对象是属于Piece还是Brand子类。

Piece不应该扩展Car,但Car应该由诸如Window、Door等Piece对象组成。一个片段应该实现equals/hashcode。尽管让接口显式定义这些函数并不意味着继承的类需要它,但它仍然暗示它是必要的(请参阅Comparator)

equals合同要求引用的成员为最终成员,以满足合同要求。Brand overrides equals/hashcode用于比较品牌名称

门窗需要定义最终成员,使其真正独特,但遗憾的是,问题中没有提供任何成员

静态级轿车{
私人成品门;
私人最终作品窗口;
私人最终品牌;
私有最终整数哈希码;
汽车(件门、件窗、品牌){
这个。门=门;
this.window=窗口;
这个品牌=品牌;
this.hashCode=Objects.hash(门、窗、品牌);
}
@凌驾
公共int hashCode(){
返回哈希码;
}
@凌驾
公共布尔等于(对象obj){
如果(obj==此){
返回true;
}
if(汽车的obj实例){
车辆其他车辆=(车辆)obj;
返回otherCar.doors.equals(doors)和otherCar.window.equals(window)和otherCar.brand.equals(brand);
}
返回false;
}
}
静态类窗口实现了一个{
@凌驾
公共int hashCode(){
返回super.hashCode();
}
@凌驾
公共布尔等于(对象obj){
返回super.equals(obj);
}
}
静态类门器件{
@凌驾
公共int hashCode(){
返回super.hashCode();
}
@凌驾
公共布尔等于(对象obj){
返回super.equals(obj);
}
}
接口件{
布尔等于(对象其他);
int hashCode();
}
静态类品牌{
私有最终字符串名;
私有最终整数哈希码;
品牌(字符串名称){
this.name=名称;
this.hashCode=Objects.hash(名称);
}
@凌驾
公共布尔等于(对象其他){
如果(其他==此){
返回true;
}
if(品牌的其他实例){
品牌其他品牌=(品牌)其他;
返回otherBrand.name.equals(name);
}
返回false;
}
@凌驾
公共int hashCode(){
返回哈希码;
}
}

您在
片段
车内
使用合成和继承,我想您可能有点困惑。
汽车
有一个
零件
零件
不是
汽车
。我认为这应该只使用构图。
这辆车看起来不对劲。你是否打算允许使用
Car=new-Piece()然后
car.drive()(或者汽车应该能做的事情)?关于
Brand extends Car
也一样。你应该在你的工件实例上调用equals,不要使用==比较它们。你的模型有点奇怪。与现实生活类似,汽车是由零件制成的,并且有品牌。在您的车型中,
品牌
都是汽车。您是否希望车轮上有
?您可以在它们上调用
equals
(当然,在实现此方法之后)