我目前正在学习Java。请看下面的代码:
package classtest1;
class ClassSuper
{
public Object myObject = new Object();
public ClassSuper(){}
}
public class ClassTest1 extends ClassSuper
{
public ClassTest1()
{
System.out.println("this.myObject.equals(super.myObject) return: " + this.myObject.equals(super.myObject));
System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject));
}
public static void main(String[] args)
{
ClassTest1 myClassTest1 = new ClassTest1();
}
}
输出如下:
run:
this.myObject.equals(super.myObject) return: true
false
BUILD SUCCESSFUL (total time: 0 seconds)
我的问题是,为什么等于和“==”不一样?使用“==”时为什么输出false。 Subclass会在内存中创建一个新的副本myObject吗?
答案 0 :(得分:7)
Subclass会在内存中创建一个新的副本myObject吗?
没有。你只是不比较你认为你正在比较的对象。
System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject));
将String
"this.myObject == (super.myObject) return: " + this.myObject
与(super.myObject)
进行比较,然后返回false
。
当评估传递给System.out.println
的参数时,将从左到右进行评估。首先将this.myObject.toString()
连接到"this.myObject == (super.myObject) return: "
,然后将生成的String
与(super.myObject)
运算符与==
进行比较。
如果用括号包装比较:
System.out.println("this.myObject == (super.myObject) return: " + (this.myObject == super.myObject));
由于true
和this.myObject
引用相同的super.myObject
,您将获得预期的比较Object
。
答案 1 :(得分:0)
System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject));
实际上这是比较字符串。第一个字符串是"this.myObject == (super.myObject) return: " + this.myObject
第二个字符串是(super.myObject)
如果要比较对象,请使用小括号作为(this.obj == (super.obj))
}
答案 2 :(得分:0)
您对所产生的输出感到困惑,因此下面是您需要关注的几点。
Operator Preferences :Java具有明确定义的规则,用于指定表达式具有多个运算符时计算表达式中的运算符的顺序。
为了更好地理解,请检查执行以下代码的尝试。
public class ClassTest1 extends ClassSuper
{
public ClassTest1()
{
System.out.println("this.myObject.equals(super.myObject) return: " + (this.myObject.equals(super.myObject)));
System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject));
System.out.println("this.myObject == (super.myObject) return: " + (this.myObject == (super.myObject)));
}
...
}
上述更改的程序控制台。
this.myObject.equals(super.myObject) return: true
false
this.myObject == (super.myObject) return: true
<强>参考文献:强>