一道SCJP题目

今天在看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
 

 


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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值