Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 我如何在课间换车?_Java_Equals - Fatal编程技术网

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”到底是什么意思,但这能解决您的问题吗?