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

时间:2016-11-29 09:42:03

标签: java

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

3 个答案:

答案 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));

由于truethis.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

<强>参考文献: