【问题标题】:Does java subclass use the same superclass field objectjava子类是否使用相同的超类字段对象
【发布时间】:2017-04-13 05:54:22
【问题描述】:

我目前正在学习 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 副本吗?

【问题讨论】:

标签: java


【解决方案1】:

您对生成的输出感到困惑,因此以下是您需要关注的几点。

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

参考资料:

【讨论】:

  • 谢谢兄弟。我现在明白了。
【解决方案2】:

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))

【讨论】:

    【解决方案3】:

    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

    【讨论】:

    • 我明白了。谢谢伊兰。
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2012-04-27
    • 2017-02-13
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多