java对象比较和继承
需要你帮我解答一个练习题吗 如何修改Lower Bar类,使o.equals(0)返回false,不允许重写从超类继承的equals()java对象比较和继承,java,object,inheritance,comparison,Java,Object,Inheritance,Comparison,需要你帮我解答一个练习题吗 如何修改Lower Bar类,使o.equals(0)返回false,不允许重写从超类继承的equals() public class Scratchpad { public static void main(String[] args) { Bar o = new Bar(); System.out.println(o.equals(o)); } } class Foo { public boolean
public class Scratchpad {
public static void main(String[] args) {
Bar o = new Bar();
System.out.println(o.equals(o));
}
}
class Foo {
public boolean equals(Object o) {
return this == o;
}
}
class Bar extends Foo{
}
不确定这是否是您要查找的内容,但您可以重载
equals
class Bar extends Foo{
public boolean equals(Bar b){
return false;
}
}
不确定这是否是您要查找的内容,但您可以重载
equals
class Bar extends Foo{
public boolean equals(Bar b){
return false;
}
}
你为什么要这么做?我想您可以在
Foo
中使用以下内容,但它打破了许多好的设计原则,如果其他人需要使用您的代码,以后可能会导致奇怪的行为
public final boolean equals(Object o) {
return o.getClass() == Foo.class && this == o;
}
注:这也违反了以下合同:
它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
你为什么要这么做?我想您可以在
Foo
中使用以下内容,但它打破了许多好的设计原则,如果其他人需要使用您的代码,以后可能会导致奇怪的行为
public final boolean equals(Object o) {
return o.getClass() == Foo.class && this == o;
}
注:这也违反了以下合同:
它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
确实要
o.equals(o)
返回false吗?这是一个学术练习吗?@NG考虑到操作的第一行,这是一个安全的赌注。所以你想知道:我如何在不重写equals的情况下重写equals?是的,这是一个学术练习,下面是完整的问题,如果它有帮助//一个类Foo有一个方法boolean equals(Object o),它只返回测试的答案this==o。创建一个子类Bar,以便在声明Bar后b=new Bar();调用b.equals(b)返回false。为了解决这个问题,不允许重写从超类Foo继承的equals方法。这太糟糕了,我能问一下这个练习是从哪里来的吗?说o不等于o违反了任何和所有的惯例。答案是,您必须按照Jeffrey所说的那样编辑Foo类,但这样做是令人震惊的。您确定要o.equals(o)
返回false吗?这是一个学术练习吗?@NG考虑到操作的第一行,这是一个安全的赌注。所以你想知道:我如何在不重写equals的情况下重写equals?是的,这是一个学术练习,下面是完整的问题,如果它有帮助//一个类Foo有一个方法boolean equals(Object o),它只返回测试的答案this==o。创建一个子类Bar,以便在声明Bar后b=new Bar();调用b.equals(b)返回false。为了解决这个问题,不允许重写从超类Foo继承的equals方法。这太糟糕了,我能问一下这个练习是从哪里来的吗?说o不等于o违反了任何和所有的惯例。答案是,您必须按照Jeffrey所说的那样编辑Foo类,但这样做太可怕了。如果您执行类似于Object o=new Bar();o、 等于(o)代码>这种覆盖不是等于()吗?不,是重载,这是另一回事。我很确定这是正确的答案。@user3363135不,这是一个重载。这就是为什么如果使用Jeffrey提供的代码片段,它就不起作用,因为它将调用Foo类中的equals方法。然而,看看你的作业,我相信这是唯一的方法。如果你做一些像Object o=new Bar();o、 等于(o)代码>这种覆盖不是等于()吗?不,是重载,这是另一回事。我很确定这是正确的答案。@user3363135不,这是一个重载。这就是为什么如果使用Jeffrey提供的代码片段,它就不起作用,因为它将调用Foo类中的equals方法。但是看看你的作业,我相信这是唯一的方法。