分享

一段JAVA代码不知道碾压多少小伙伴,请大神科普!!

evababy 2018-5-25 15:16:09 发表于 疑问解答 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 5870
[mw_shl_code=java,true]import java.util.ArrayList;
import java.util.List;
public class Torment {
        public static void main(String[] args) {
                String s1 = "s1";
                String s2 = "s2";
                StringBuffer s3 = new StringBuffer("s3");
                StringBuffer s4 = new StringBuffer("s4");
                List l5 = new ArrayList();
                List l6 = new ArrayList();
                test(s1, s2, s3, s4, l5, l6);
                System.out.println("3(s1)=" + s1);
                System.out.println("3(s2)=" + s2);
                System.out.println("3(s3)=" + s3);
                System.out.println("3(s4)=" + s4);
                System.out.println("3(l5)=" + l5.size());
                System.out.println("3(l6)=" + l6.size());
        }

        static void test(String s1, String s2, StringBuffer s3, StringBuffer s4, List l5, List l6) {
                System.out.println("1(s1)=" + s1);
                System.out.println("1(s2)=" + s2);
                System.out.println("1(s3)=" + s3);
                System.out.println("1(s4)=" + s4);
                System.out.println("1(l5)=" + l5.size());
                System.out.println("1(l6)=" + l6.size());

                s2 = s1;
                s1 = "s1_2";
                s4 = s3;
                s3 = new StringBuffer("s3_2");
                l5 = new ArrayList();

                System.out.println("2(s1)=" + s1);
                System.out.println("2(s2)=" + s2);
                System.out.println("2(s3)=" + s3);
                System.out.println("2(s4)=" + s4);
                System.out.println("2(l5)=" + l5.size());
                System.out.println("2(l6)=" + l6.size());
                s3.append("_3");
                s4.append("_3");
                l5.add("1");
                l6.add("1");
        }
}[/mw_shl_code]


输出结果是
1(s1)=s1
1(s2)=s2
1(s3)=s3
1(s4)=s4
1(l5)=0
1(l6)=0
2(s1)=s1_2
2(s2)=s1
2(s3)=s3_2
2(s4)=s3
2(l5)=0
2(l6)=0
3(s1)=s1
3(s2)=s2
3(s3)=s3_3
3(s4)=s4
3(l5)=0
3(l6)=1


1、2段输出没任何异议,请解释以下第3段输出5个数据的由来,以及s3 和 l5 为什么不一致?




补充内容 (2018-5-30 16:28):
我所找到解释方法参数是值传递,但是如果是引用会为其创建一个副本,同时指向原地址,其实相当于引用,只不过这个过程都叫做参数传递。
s3重新赋值后app没有改变原值,但是s4重新指向s3,s4app实质修改的是S3的

补充内容 (2018-5-30 16:30):
结论:抛开纯值传递不说,方法内对引用参数重新赋值后就无法操作原地址,否则操作的就是原值!

已有(2)人评论

跳转到指定楼层
hello2018 发表于 2018-5-25 18:09:09
本帖最后由 hello2018 于 2018-5-25 18:23 编辑

其实这个学术性比较强,实际意义不强。
去掉下面两个,就好理解了。
s3 = new StringBuffer("s3_2");
        l5 = new ArrayList();

回复

使用道具 举报

fly2015 发表于 2018-5-28 11:32:36
s3 地址没变 还是原来的
s5.add(1) 已经不是之前的s5了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条