java单向值传递_一、Java的值传递和引用传递

面试的的多了,多多少少会有些面试官会问到Java的值传递问题, 或者在笔试题中也会出现, 那么Java的参数传递是怎样的呢?

1. 如果参数类型是原始类型(基本类型),那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.

2. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址对应的那个对象中的值,那么在函数内的改变会影响到传入的参数。

如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。

@Testpublic voidtest1() {

String str= new String("good");char[] ch = {'a', 'b', 'c'};

change(str, ch);

System.out.println(str); // good

System.out.println(ch); //gbc

}public void change(String str, char[] ch) {

str= "test OK!";

ch[0] = 'g';

}

@Testpublic voidtest2() {

StringBuffer a= new StringBuffer("A");

StringBuffer b= new StringBuffer("B");

operate(a, b);

System.out.println(a+ "," + b); //AB,B

}private voidoperate(StringBuffer a, StringBuffer b) {

a.append(b);

b=a;

}

@Testpublic voidtest3() {

Integer x= new Integer(1);

System.out.println(x);//1

t(x);

System.out.println(x);//1

}private voidt(Integer x) {

x= new Integer(2);

}

综上所述,  基本数据类型传递的是值得拷贝;对象类型传递的是引用的拷贝(地址的传递),而String类型传递的虽然也是对象,但它不同于一般的对象类型, 它String类被设计为不可修改的类型(final修饰)也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用.

那么StringBuffer 和 Stringbuilder 呢?

68c07de999764ab04dde8852c01dedd3.png

重点理解为什么,function_1和function_2结果不同?

下面是function_1的图解:

a031b7a9ed3e5b9f2483718ba85d9e51.png

builder.append("4")之后

8a8ef0e21f0c655866bee285e144d346.png

下面是function_2的图解:

5a82dca3f9aa82bcc873763fb12fda05.png

builder = new StringBuilder("ipad"); 之后

8c783936480f0dc5aa0f175c43c19cfa.png

说明StringBuffer和StringBudder也是地址的传递.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值