JAVA中方法的参数是按值传递的,有个例子很经典

看《Java编程思想(第四版)》到字符串部分了。之前有部分章节没有写读书笔记,因为这一两个月由于种种原因有所耽搁,想赶赶时间,况且有些内容比较熟悉,觉得没太必要现在立即就写读书笔记,以后有时间再补吧。

但今天遇到一个比较经典的例子,想记录下来,不过这个例子并不是来自书上,是我在网上查到的。

书上讲字符串的第十三章开头就讲到 String 是不可变的,我们在一些方法里将一个字符串传过来传过去,看似是改变了这个String变量,实际是创建了一个全新的String ,而最初的String对象丝毫未动。

书上在接下来的解释文字中提到方法间传递参数(这个参数是对象的情况下),实际是copy了一份引用。这段话出现在这里,加上前面说的String对象未变,这两者联系在一起容易让人产生误解。其实这只是String的特性,并不是说在方法间传递参数,对象都不会变。

我在网上看到下面这样一个例子,不过在我记录这个例子之前我想把我要记录的本质内容先概括一下,就是“JAVA中,给方法传递参数都是按值传递,参数是对象时,是将其引用按值传递(即copy一份),而引用指向对象,所以对象也会改变(只是String因其自身特点不会变)” 

例子是这样的:

public   class  Test03  {
    
public static void test(StringBuffer ts, StringBuffer ts2){
        System.out.println(ts);        
//1
        System.out.println(ts2);    //2
        ts2 = ts;
        ts 
= new StringBuffer("new");
        System.out.println(ts);        
//3
        System.out.println(ts2);    //4
        ts.append("appended");
        ts2.append(
"appended");
    }

    
public static void main(String[] args) {
        StringBuffer s 
= new StringBuffer("Good");
        StringBuffer s2 
= new StringBuffer("Bad");
        test(s,s2);
        System.out.println(s);        
//5
        System.out.println(s2);        //6
    }

}

输出的结果为:

Good
Bad
new
Good
Goodappended
Bad

从main方法开始看:

首先:
s指向的对象值是"Good";
s2指向的对象值是"Bad";
s和s2传入test()方法,实际是各自copy了一份给了test();
在1处,ts指向的对象即s指向的对象,所以打印出来为"Good";
在2处,ts2指向的对象即s2指向的对象,所以打印出来为"Bad";
然后ts2=ts,这时ts2指向的对象变成了ts指向的对象,同时也是s指向的对象,而ts指向的对象未变,此时,s、ts、ts2指向同一个对象"Good";
再然后,ts=new StringBuffer("new"); ts重新定向到新创建的对象"new";
于是,3处打印出来的是"new";
4处,前面说了ts2指向的是"Good",所以打印出来的是"Good";
然后,ts指向的对象(即"new")后面追加了"appended",这个东西到现在为止只有ts指向之,s和ts2没动过,还是指向"Good";
再然后,ts2指向的对象后面追加了"appended",也就是s指向的对象后面追加了,也就是值"Good"的这个对象后面追加了,变成"Goodappended";
返回到main方法,s指向的对象刚才说了,变成了"Goodappended",所以5处,打印出来是"Goodappended";
s2从头到尾没它什么事儿,没变过,所以6处打印出来的还是"Bad"。

就这么回事,再加一句,对象一直呆在堆上没动,在方法之间忙来忙去的都是在堆栈上的对对象的引用,方法操作引用或改动了其指向的对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值