2016-11-29 9 views
2

現在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を出力するのですか?サブクラスは新しいコピーmyObjectをメモリに作成しますか?

+1

'==' チェック等しい値を確認しています。 – Darshit

+7

[.equals()と==演算子で2つのオブジェクトを比較する]の複製が可能です。(0120-1738742/compare-two-objects-with-equals-and-operator) – hotzst

+0

'.equals ()がテストに合格すると、それは2つが論理的に同等であることを意味します。これはクラス階層から期待されるものです。 –

答えて

7

サブクラスは新しいコピーmyObjectをメモリに作成しますか?

いいえあなたが比較していると思うオブジェクトを単純に比較しているわけではありません。

System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject)); 

(super.myObject)からString"this.myObject == (super.myObject) return: " + this.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)); 

をあなたはthis.myObjectsuper.myObjectが同じObjectを参照しているため、trueを返します、あなたが意図した比較を取得します。

+0

私は参照してください。 Eranに感謝します。 –

0

System.out.println("this.myObject == (super.myObject) return: " + this.myObject == (super.myObject));
実際これは文字列を比較しています。あなたがオブジェクトはあなたがそのように、以下の生成出力と混同されている
(this.obj == (super.obj))

0

として小さな金具を使い比較したい場合は最初の文字列は
"this.myObject == (super.myObject) return: " + this.myObject
2番目の文字列が
(super.myObject)
であるあなたが集中する必要があるいくつかのポイントです。

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 

参照:オブジェクト参照の

+0

仲間ありがとう。今、私は分かる。 –

+0

あなたは歓迎です:) – 09Q71AO534

関連する問題