Java 我如何在课间换车?
这是我写的Java 我如何在课间换车?,java,equals,Java,Equals,这是我写的 public class Test { public static void main(String[] args) { Object a1 = new A(); Object a2 = new Object(); System.out.println(a1.toString()); System.out.println((a1 == a2) + " " + (a1.equals(a2))); } }
public class Test {
public static void main(String[] args) {
Object a1 = new A();
Object a2 = new Object();
System.out.println(a1.toString());
System.out.println((a1 == a2) + " " + (a1.equals(a2)));
}
}
class A {
int x;
public boolean equals(Object obj) {
A _obj = (A) obj;
return x == _obj.x;
}
public String toString() {
return "A's x is " + x;
}
}
如何在控制台上设置“false-true”?除了修改主要方法。只修改一种方法。
我试图将对象a2更改为a2。如何在A类中更改该属性?您得到错误的原因是无法将类java.lang.Object强制转换为类A,因为您将其与之进行比较的对象不是类A的实例,因此尝试将该对象强制转换为类A将失败 在实现
.equals
方法时,在尝试比较对象的属性之前,应始终首先执行以下三项检查以确保对象的安全:
if(obj==this)返回true
如果两个对象是完全相同的对象,这意味着它们是相同的实例,而不仅仅是具有相同属性的两个对象,则立即返回true,因为不需要检查属性
if(obj==null)返回false
这通过尝试访问null
对象的属性(例如在代码中执行返回x==\u obj.x
)来防止null点异常
if(!(obj instanceof A))返回false
如果对象不是类的实例,则typecast将失败(就像在代码中一样),这可以通过在尝试强制转换之前返回false
来防止失败
最后,如果代码达到这一点,您可以像在代码中那样强制转换和比较对象:
A _obj = (A) obj;
return this.x == _obj.x;
请记住,如果要比较的属性不是基本属性,则应在它们上使用.equals
首先,您所说的“使假为真”到底是什么意思?我假设您希望您的代码运行,但是您能为我们提供一点您试图执行的操作的上下文吗
代码失败的原因是,当您将对象(a2)的实例传递到equals方法时,试图将其强制转换到类型a的引用上。但由于a2实际上是对象的纯实例,而不是a的纯实例,因此此强制转换失败。尽管Object是Java中所有东西的基类,包括自定义的A,但您的选择方向是错误的。对象不包含属性x,因此以这种方式强制转换是不安全的。Java的类型检查机制捕捉到这一点,并在您尝试强制转换时抛出一个错误
请看一篇解释继承和转换的文档,以了解这方面的基本知识。例如 嘿!把代码贴在这里。不要将代码作为图像发布。您可以编辑您的问题。请将代码和错误添加为文本(),而不是图像。图片:A)不允许我们复制和粘贴代码/错误进行测试;B) 不允许基于代码/错误内容进行搜索;和。一般来说,文本格式的代码/错误比图像格式的代码/错误要好得多,后者比没有要好得多。如果图像添加了一些仅由文本代码/错误无法传达的重要信息,则只能在代码格式的文本之外使用图像。@NoahChoi没问题。正如其他人提到的,我不确定您所说的“在控制台上设置为false true”到底是什么意思,但这能解决您的问题吗?