2017-07-14 7 views
0

オブジェクトAint var;のような属性を持ち、オブジェクトBの属性がint var2の場合、両方のオブジェクトが同じコンストラクタを使用して同じクラスからインスタンス化されています。説明のためにvar=3var2=0を割り当てようとしていますA=BA.var==0になりますか?私のためにあなたの答えに動機を与えてください。ここOOP/JAVA:別のオブジェクトへのassingはその属性(クラス変数)も変更しますか?

あなたがより多くを必要とする場合に、よりコードです:

人々がご理解のおかげでたくさん、私はすでに知っていることを私に説明しattemtpting前にコードを確認してください

public class CarSize{ 
    public CarSize(int x) 
    { 
     this.var=x; 
    } 
    public void call() 
    { 

     doubleVar(this); 

    } 
    private void doubleVar(CarSize cz) 
    { 
     int vara= cz.getVar()*2; 
     CarSize c= new CarSize(vara); 
     cz=c; 

    } 
    public int getVar(){return this.var;} 
    private int var; 
    public static void main(String args[]) 
    { 
     CarSize cz = new CarSize(3); 
     cz.call(); 
     System.out.println(cz.getVar()); 
    } 

} 

ANNOUNCEMENT 。

+0

これは変更されていませんAのフィールドでは、代入はAをBと同じ場所にするので、このフィールドはB – Semant1ka

+0

と同じになりますが、少なくとも表示されたコードではそれほど意味がありません。私 –

+0

そしてあなたは何を期待していますか?あなたのコードは6を返しますか?完全に論理を得ることはできません。また、私はcz = new CarSize(vara)を提案します。テンポラリオブジェクトなし – Semant1ka

答えて

0

オブジェクトへの参照を別のオブジェクトに割り当てることはできますが、別のオブジェクトにオブジェクトを割り当てることはできません。あなたのケースでは、AとBの両方が以前に参照されたBと同じオブジェクトを参照します。以前にAによって参照されたオブジェクトはガベージコレクタによって取得され、存在しなくなります。

0

Javaでは、=演算子を非プリミティブで使用すると、エイリアシングが発生します。同じクラスのオブジェクトが2つある場合、abの場合、a = b;と表示すると、は、bと同じオブジェクトになり、ガベージコレクションでは最終的にはaのものが破棄されます。

だから、はい、フィールドが同じになりますが、aフィールドのsの値「フィールドのsの値もbを変更します」変更することはabは今同じであるため。

2

あなたのコードは、コードのこの短い1で期待嘘のように動作しませんなぜ問題:CarSizeので

cz=c; 

は、CarSizeオブジェクトではなく、CarSizeからCarSize店「ポインタ」の変数参照型でありますオブジェクト自体。

車のサイズをパラメータとして渡すときは、「ポインタ」を渡しています。 cz=cは、czに格納されているポインタをcに格納されているオブジェクトと同じオブジェクトにします。

さて、あなたは、このメソッドを呼び出す方法を見てみましょう:

doubleVar(this); 

this

は、mainメソッド内で宣言され czを指します。再び、 thisは車のサイズのオブジェクトを指します。 doubleVarメソッドでは、パラメータのポイントを別のオブジェクトに設定しましたが、 のパラメータを他のものに設定するだけでした。 thisは変更されず、フィールドも変更されません。

だからこそ、値が2倍になるのを見ることができません。

これを修正するには、パラメータに新しい値を割り当てないでください。代わりにthisを直接変更してください。それが必要でないので、パラメータを取り除く。

private void doubleVar() 
{ 
    this.var *= 2; // you can actually omit "this.", I put it there just to make it clear for you 

} 
0
public class Test{ 

    public static void main(String[] args){ 

    object a = new object(3); 
    object b = new object(0); 

    a = b; 
    System.out.println(a.var); 
    } 
} 


public class object{ 

    protected int var; 
    public object(int x){ 
    var = x; 
    } 
} 

これは、あなたが正確に説明した状況のコードです。プログラマ定義のオブジェクトが同じタイプの別のオブジェクトと同じに設定されている場合、元の値3から新しい値0に上書きされるため、ここでの出力は「0」になります

関連する問題