7

まず、この質問で申し訳ありません。これは非常に古いトピックです。
はい、Javaが値渡しであるという多くの検索を行いました。
しかし、私のプログラムでは、その出力を示しています。私はなぜ理解できないのですか?
私のプログラムは

class Dog{
    static String dogName;
    Dog(String name){
        dogName=name;
    }
    public void setName(String newName){
        dogName=newName;
    }
    public String getName(){
        return dogName;
    }
}
class JavaIsPassByValue{
    public static void main(String arr[]){
        Dog dog1=new Dog("OldDog");
        new JavaIsPassByValue().display(dog1);
        System.out.println(dog1.getName());
    }
    public void display(Dog d){
        System.out.println(d.getName());
        d = new Dog("NewDog");
        System.out.println(d.getName());
     }
}

出力は
OldDog
NewDog
NewDog
期待してい
OldDog
NewDog
OldDog
ますが、どこが間違っているのか誰か教えてください。

4

5 に答える 5

3
static String dogName;

する必要があります

String dogName;

static を持つ両方のオブジェクトは、同じ dogName (クラス レベル フィールド) を共有します。

2 つのオブジェクトと値渡しですが、1 つのオブジェクト dogName が変更されました。

于 2013-09-12T13:01:32.190 に答える
2

大きなヒント: Dogの dogName フィールドからstatic修飾子を削除すると、期待どおりの結果が得られます。一般的なアドバイス: static 修飾子には注意してください

あなたのDogクラスは次のようになります。

class Dog{
    private String dogName;
    Dog(String name){
        dogName=name;
    }
    public void setName(String newName){
        dogName=newName;
    }
    public String getName(){
        return dogName;
    }
}

「値渡し」の実験については、dogNameを出力するのではなく、オブジェクト参照を出力することをお勧めします。つまり、次のようにテストを変更します。

class JavaIsPassByValue{
    public static void main(String arr[]){
        Dog dog1=new Dog("OldDog");
        new JavaIsPassByValue().display(dog1);
        System.out.println("dog1: " + dog1);
    }
    public void display(Dog d){
        System.out.println("d in moment 1: " + d.getName());
        d = new Dog("NewDog");
        System.out.println("d in moment 2: " + d.getName());
     }
}
于 2013-09-12T13:20:22.570 に答える
1

Java では、オブジェクト参照は常に値渡しであることに注意してください。static出力動作は、変数を使用してコンストラクターで割り当てるためであると言っています。

static String dogName;

Dog新しいインスタンスが作成されたときは静的変数であるため、以前dogNameは新しい値で上書きされるため、その出力が表示されます。

で置き換えると

private String dogName;

意図した結果が表示されるはずです


ヒント:thisキーワードを使用して、コンパイル中にそのようなエラーをキャッチすると便利です

Dog(String name){
    this.dogName=name;
}
于 2013-09-12T13:01:48.627 に答える