[英]Does java subclass use the same superclass field object
我目前正在学习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吗?
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
。
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))
您对产生的输出感到困惑,因此下面是您需要关注的几点。
运算符首选项 :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
参考文献:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.