繁体   English   中英

java子类是否使用相同的超类字段对象

[英]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.myObjectsuper.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM