java中只有值传递_Java中只有值传递

在Java中只有值传递。

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递中有几个例子,先一一的解释一下。

数值类型

public static void main(String[] args) {

ParamTest pt = new ParamTest();

int i = 10;

pt.pass(i );

System.out.println("print in main , i is " + i);

}

public void pass(int j) {

j = 20;

System.out.println("print in pass , j is " + j);

}

输出:

print in pass , j is 20

print in main , i is 10

在这个例子中,j的改变没有影响到i这个变量。

对象

public static void main(String[] args) {

ParamTest pt = new ParamTest();

User hollis = new User();

hollis.setName("Hollis");

hollis.setGender("Male");

pt.pass(hollis);

System.out.println("print in main , user is " + hollis);

}

public void pass(User user) {

user.setName("hollischuang");

System.out.println("print in pass , user is " + user);

}

这个输出

print in pass , user is User{name='hollischuang', gender='Male'}

print in main , user is User{name='hollischuang', gender='Male'}

字符串对象

public static void main(String[] args) {

ParamTest pt = new ParamTest();

String name = "Hollis";

pt.pass(name);

System.out.println("print in main , name is " + name);

}

public void pass(String name) {

name = "hollischuang";

System.out.println("print in pass , name is " + name);

}

这个输出

print in pass , name is hollischuang

print in main , name is Hollis

有人会说,第2个例子改变了不就是引用传递吗,并不是。综合2和3的例子来看

在例子2中:

实际上,这个并没有直接传递地址,而是两个不同的对象,指向同一个引用。在main中的hollis是一个对象,他有自己的地址,值是一个引用;在pass方法中的user又是另一个对象,他也有自己的地址(和hollis的地址不一样),他的值也是一个引用。从main中传递到pass中,是hollis的值(一个引用)赋给user的值(一个引用)。并没有直接将hollis的地址赋值给user。所以还是值传递,只不过这个值是一个引用。当修改user时,实际修改了引用中的内容,那么hollis中引用的对象中的内容自然也会变。

在例子3中

这里main中没有改变是因为赋值了一个新的对象给user,user指向了一个新的引用(String的性质),而不是修改了原引用中的值,所以user的改变没有影响到main中的对象。如果第3个例子中把String换成StringBuilder,并使用append方法,那么引用就不会改变,得到的结果就类似于例子2。

演示:

public static void main(String[] args) {

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("hello");

change(stringBuilder);

System.out.println(stringBuilder.toString());

}

public static void change(StringBuilder stringBuilder) {

stringBuilder.append(",world");

System.out.println(stringBuilder.toString());

}

hello,world

hello,world

感谢此文章的帮助

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值