一道SCJP题目

来源:互联网 发布:大数据的三个哲学问题 编辑:程序博客网 时间:2024/06/05 12:07

今天在看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());        }}
输出结果是:

GobStopperFizzylifting

我的理解是java中有值传递和址传递,java中基本数据类型是值传递,对象是址传递,所以上面的传进去的是一个地址,然后在方法中把这个地址的指向给变了,并且修改了值,所以it变量的值也跟着变了。所以输出应该是

ScrumdiddlyumptiousFizzylifting

其实则不然。

我又改了一下代码,改成如下:

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());        }}
这一次的输出结果是

ScrumdiddlyumptiousFizzylifting


那么我刚开始的理解那里有错误呢,然后在方法中把这个地址的指向给变了 这句有错。因为传进方法的的确是地址,但一定会有个变量存这个地址,在这个代码中方法的参数Item it 存了这个地址,也就是说现在方法中的it和方法外的it指向的对象虽然是同一个对象,但两个it不是同一个变量,此时任何一个it对对象修改都会对对应产生影响(因为指两个it指向的是同一个对象),但是在第一个程序的方法中有it=new Item(),这一句把方法中的it所指向的对象给改变了,改变后两个it所指向的对象已经不同,一个对象的改变当然不会对另一个对象产生影响。所以第一个的输出和第二个的输出现在看就很理所当然了。


并且个人认为java中不存在所谓的“引用传递”和“址传递”。这只是一种说法罢了。其实“引用传递”和“址传递”传过去的仍然是一个值,是地址的一个副本罢了,所以严格说来java中只有值传递。