2017-11-12 15 views
-4

私は車の広告の小さなプログラムを書いたことがありますが、なぜ私の変数c1が私のセッターメソッドで作られた最新の車オブジェクトに更新されないのか混乱しています。Java:オブジェクトの参照変数がオブジェクトの新しいインスタンスに更新されていませんか?

public class coolCars { 
    public static void main(String args[]) { 
     Car c1 = new Car("Barry", "998D", "Prius", 50, 1800.50); 
     System.out.print(c1); 
     c1.setOwner("Jerry"); 
     System.out.println(c1.owner()); 
     /*c1.setOwner("Mick"); 
     System.out.print(c1); 
     c1.setKil(70); 
     System.out.print(c1);*/ 
    } 
} 

は、そして、ここでc1がまだオブジェクトの初期インスタンスを指している意味所有者変数が更新されていない、前述したように、私の車のクラス

final class Car { 
    private final String owner; 
    private final String reg; 
    private final String make; 
    private final int kilometres; 
    private final double price; 
    public Car(String ow, String r, String m, int k, double p) { 
     owner = ow; reg = r; make = m; kilometres = k; price = p; 
    } 
    public String owner(){return this.owner;} 
    public String reg(){return this.reg;} 
    public String make(){return this.make;} 
    public int kilometres(){return this.kilometres;} 
    public double price(){return this.price;} 
    public Car setPrice(double p){return new Car(owner(), reg(), make(), kilometres(), p);} 
    public Car setOwner(String ow){return new Car(ow, reg(), make(), kilometres(), price());} 
    public Car setKil(int k){return new Car(owner(), reg(), make(), k, price());} 
    public Car setMake(String m){return new Car(owner(), reg(), m, kilometres(), price());} 

    public String toString(){return "(" + owner + " " + reg + " " + make + " " + kilometres + " " + price + ") ";} 
} 

です。何か案は?ありがとう。

+1

[mcve]を入力し、現在の例よりも読みやすいように*ロット*形式で入力してください。しかし基本的には、 'setOwner'メソッドは* new *' Car'インスタンスを生成し、その参照を返します。この参照はあなたの呼び出しコードでは無視されます。あなたが 'c1 = c1.setOwner(" Jerry ");を持っていたら、それはうまくいくでしょう。 'c1'変数の値を変更するためにオブジェクトの新しいインスタンスを作成するだけの理由は何でしょうか? –

+0

本当にありがとう。あなたは間違いなく、私はそれを見ています。私は不器用なものの重要性について学んでいます。そして、私はc1がそれを新しい車に「自動的に」変えることを期待していると思います。ありがとう! – petegoast

+0

私は 'setOwner'メソッドの名前を' withOwner'に改名し、個人的に(そして残りのメソッドも)変更しました。それは、その方法が何をするかという点でより直感的です。 –

答えて

1

あなたはすべてのこれらの方法で値を設定されていません。

public Car setPrice(double p){return new Car(owner(), reg(), make(), kilometres(), p);} 
public Car setOwner(String ow){return new Car(ow, reg(), make(), kilometres(), price());} 
public Car setKil(int k){return new Car(owner(), reg(), make(), k, price());} 
public Car setMake(String m){return new Car(owner(), reg(), m, kilometres(), price());} 

あなただけの何もしないCarの新しいインスタンスを返しています。

次のように行います

public Car setPrice(double price){ this.price = price } 
public Car setOwner(String owner){ this.owner = owner } 
public Car setKil(int kilometres){ this.kilometres = kilometres} 
public Car setMake(String make){ this.make = make } 
0

SETOWNER方法車の新しいインスタンスを作成しています。あなたの主な方法では、C1は依然として最初に作成されたカーオブジェクトを指しています。 c1 = c1.setOwnerにする必要があります。しかし、これは直観に反しているようです。あなたのセッターメソッドは、単にそのオブジェクトのCarのクラスレベル変数を更新する必要があります。新しいオブジェクトを作成しません。

0

各Setterメソッド(価格、所有者、キロメートル、およびメーク)は、新しいCarオブジェクトを作成して返します。

c1.setOwner("Jerry"); 

したがって、(新しく作成された)が返さCarオブジェクトが迷子にされています。次の文で

は、何の割り当てはありません。

それを割り当てることによって変更して試してみてください。

c1 = c1.setOwner("Jerry"); 

または上記示唆したようにセッターメソッド自体を修正することができます。

関連する問題