Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Equality - Fatal编程技术网

Java 如何检测相同类型的两个对象中的所有变量是否相同?

Java 如何检测相同类型的两个对象中的所有变量是否相同?,java,variables,equality,Java,Variables,Equality,假设我有两个对象,A和B其中 Object A=new Object(); Object B=A; 默认情况下,这些对象都有两个整数:intx和inty。首先,在A和B中 (X == 0) && (Y == 0) 所以,你可以说这两者是相等的,Java也是一样。现在,假设我们更改A.X,使A.X=2。现在,A和B不再相等,因为 A.X==2 ……但是 B.X==0 然而,Java仍然表示它们是平等的 (A.equals(B)) == true (B.equals(A)) ==

假设我有两个对象,
A
B
其中

Object A=new Object();
Object B=A;
默认情况下,这些对象都有两个整数:
intx
inty
。首先,在
A
B

(X == 0) && (Y == 0)
所以,你可以说这两者是相等的,Java也是一样。现在,假设我们更改
A.X
,使
A.X=2
。现在,
A
B
不再相等,因为

A.X==2

……但是

B.X==0

然而,Java仍然表示它们是平等的

(A.equals(B)) == true
(B.equals(A)) == true

那么,如何解决这个问题呢?

您需要重写包含变量的类的.equals方法。看看这个问题:

您需要重写包含变量的类的.equals方法。看看这个问题:

如果
Object
真的是你自己的类,而不是
java.lang.Object
(如果是,那么它会有那些变量
x
y
),那么它真的是一个糟糕的类名选择

类必须重写
.equals
方法,如下所示:

@Override
public boolean equals(Object obj) {
    if(this == obj) return true;
    if(!(obj instanceof MyObject)) return false;
    MyObject other = (MyObject) obj;
    return other.x == this.x && other.y == this.y;
}

如果
Object
确实是您自己的类,而不是
java.lang.Object
(如果是,那么它将包含那些变量
x
y
),那么它确实是一个糟糕的类名选择

类必须重写
.equals
方法,如下所示:

@Override
public boolean equals(Object obj) {
    if(this == obj) return true;
    if(!(obj instanceof MyObject)) return false;
    MyObject other = (MyObject) obj;
    return other.x == this.x && other.y == this.y;
}

这样做
对象B=A,您没有创建新对象,但
B
仅指向
a
。所以这只是一个目标

因此,当您更改
A.X=2
时,
B.X
在引用相同变量时也是2,因此相等。


您可以通过打印
B.X
值来验证这一点。

执行此操作
对象B=A,您没有创建新对象,但
B
仅指向
a
。所以这只是一个目标

因此,当您更改
A.X=2
时,
B.X
在引用相同变量时也是2,因此相等。

您可以通过打印
B.X
值来验证这一点。

我认为每个人(除了辛格先生)都缺少一点:

Object A=new Object(); // Implication is that this is really a user-defined class
Object B=A;
这里只有一个对象。如果对对象a进行更改,同样的更改将出现在对象B中,因为它们是完全相同的对象。

我认为每个人(辛格先生除外)都忽略了一点:

Object A=new Object(); // Implication is that this is really a user-defined class
Object B=A;

这里只有一个对象。如果对对象a进行更改,则相同的更改将出现在对象B中,因为它们是完全相同的对象。

您的变量指向相同的对象。如果他们不平等,我会担心的!A和B是同一个对象,因此B.X==2。变量指向同一个对象。如果他们不平等,我会担心的!A和B是同一个对象,所以B.X==2。啊,好的。那么,我是否可以创建对象的精确副本作为新对象,而无需为其创建新构造函数?@StevenFontaine在类中创建一个**复制构造函数**(将值从参数复制到自身),然后通过将
a
传递为arment来使用相同的方法创建对象B作为:
object B=new object(a)。如果你需要帮助,请告诉我。只有一个问题。。构造函数的主体将包含什么内容?只需几行就可以将每个变量从
A
复制到
B
?啊,好的。那么,我是否可以创建对象的精确副本作为新对象,而无需为其创建新构造函数?@StevenFontaine在类中创建一个**复制构造函数**(将值从参数复制到自身),然后通过将
a
传递为arment来使用相同的方法创建对象B作为:
object B=new object(a)。如果你需要帮助,请告诉我。只有一个问题。。构造函数的主体将包含什么内容?将每个变量从
A
复制到
B
只需几行?