java值传递
接触java也有一段日子了,说来惭愧,最近才想起要看下java的参数传递情况,也是一个困扰了我一段日子的问题。
- 要搞清楚java的值传递,首先要分清楚什么是引用和对象。
- 例如下面的例子Person person=new Person();
- 当我们声明了Person person过后能不能直接拿来用呢,答案是否定的,肯定是不可以的,只有在为其申请了地址空间过后才能使用,Person person就是一个引用,new person就是一个对象,一个对象可以指向很多个引用,但是一个引用只能有一个对象。
- 例如String string=new String(“123”);
- 当我们再次对其赋值String string =new String(“234”);
- 会发现它的值变成了234。
- 这时候我们可以String newString =sting.
- 将他的对象再赋值给newString。
回来说到java的值传递
java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
不难理解,比如我们传入int值过后,不论代码里面怎么改变,都不会改变原来的值,但是当我们写出如下的代码
StringBuffer string =new StringBuffer("123");
setString(string);
public void setString(StringBuffer s){
s.append("123");
}
会惊讶的发现string的值变成了123123,回到这句话,传递的是该参量所引用的对象在堆中地址值的拷贝。也就是说,当我们运行该函数的时候,将会复制一个StringBuffer对象,他的引用指向string ,所以当我们改变了s的值的时候,由于他们共享一个对象,所以 string的值也会改变。
StringBuffer string =new StringBuffer("123");
setString(string);
public void setString(StringBuffer s){
s=new StringBuffer("234");
}
同理,上面的例子,为什么s的值不会改变,因为s是string的拷贝,当重新为他分配引用过后,他就会指向一个全新的对象,所以,原来的值肯定不会改变的。
如果有任何问题欢迎指正。