今天在看SCJP题库时看到一道题,我百思不得其解,题目是这样的:
public class Item {
private String desc;
public String getDescription() {
return desc;
}
public void setDescription(String d) {
this.desc = d;
}
public static void modifyDesc(Item item, String desc) {
item = new Item();
item.setDescription(desc);
}
public static void main(String[] args) {
Item it = new Item();
it.setDescription("GobStopper");
Item it2 = new Item();
it2.setDescription("Fizzylifting");
modifyDesc(it, "Scrumdiddlyumptious");
System.out.println(it.getDescription());
System.out.println(it2.getDescription());
}
}
输出结果是:
GobStopper
Fizzylifting
我的理解是java中有值传递和址传递,java中基本数据类型是值传递,对象是址传递,所以上面的传进去的是一个地址,然后在方法中把这个地址的指向给变了,并且修改了值,所以it变量的值也跟着变了。所以输出应该是
Scrumdiddlyumptious
Fizzylifting
其实则不然。
我又改了一下代码,改成如下:
public class Item {
private String desc;
public String getDescription() {
return desc;
}
public void setDescription(String d) {
this.desc = d;
}
public static void modifyDesc(Item item, String desc) {
item.setDescription(desc);
}
public static void main(String[] args) {
Item it = new Item();
it.setDescription("GobStopper");
Item it2 = new Item();
it2.setDescription("Fizzylifting");
modifyDesc(it, "Scrumdiddlyumptious");
System.out.println(it.getDescription());
System.out.println(it2.getDescription());
}
}
这一次的输出结果是
Scrumdiddlyumptious
Fizzylifting
并且个人认为java中不存在所谓的“引用传递”和“址传递”。这只是一种说法罢了。其实“引用传递”和“址传递”传过去的仍然是一个值,是地址的一个副本罢了,所以严格说来java中只有值传递。