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

5

Your problem is that your using static for DogName.

Hence when you call the constructor of Dog, you are changing the value of DogName for all Dog objects (as there is only one value actually).

static String dogName;
    Dog(String name){
        dogName=name;
    }

Change your code to this:

   String dogName;
    Dog(String name){
        dogName=name;
    }
于 2013-09-12T13:03:45.250 回答
3
static String dogName;

应该

String dogName;

具有静态的两个对象共享相同的 dogName(类级别字段)。

虽然是两个对象,并且是按值传递,但单个对象 dogName 已更改。

于 2013-09-12T13:01:32.190 回答
2

A huge hint: remove the static modifier from the Dog's dogName field and you will get what you expect. A general word of advice: Be careful with the static modifier

Your Dog class should be like this:

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

As for your "pass-by-value" experiment, may I suggest that rather than printing the dogName, just print the object reference. In other words modify your test like this:

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

既然你声明了

static String dogName;

就像static在 Dog 类中一样,所有 Dog 对象只有一个变量,而不是每个实例都有一个变量。

您可以通过简单地删除关键字来解决您的问题static,它会按预期工作。

于 2013-09-12T13:02:41.173 回答
1

请注意,在 Java 中,对象引用始终是按值传递的。说输出行为是因为使用static变量并在构造函数中分配它。

static String dogName;

因为在Dog创建新实例时它是静态变量,所以先前dogName的值会被更新的值覆盖,因此您会看到该输出。

如果您将其替换为

private String dogName;

你应该看到预期的结果


提示:this在编译期间使用关键字来捕获此类错误很有用

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