java值传递和引用传递的理解
java的基础数据类型有:(byte、short、int、long、float、double、char、boolean)八种
基础数据都是值传递,其他都是引用传递。但是引用传递要特别注意:String Integer Double等这几个类型,以下以String为例。
举例说明:
public static void main(String[] args) { String a="zkj"; System.out.println("str :"); strTest(a); System.out.println("str :"); }
public static void strTest(String b){ //这里b的地址指向main方法中a的地址 b="hello,"+b; //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b System.out.println(b); }
打印:
str : zkj
str : zkj
这里String是引用传递,但是调用strTest方法后,执行:
b="hello,"+b;
看似改变了传入的参数,但是其实是由于新建了一个string对象,所以内存中存在a:zkj,b:hello zkj,两个地址,所以这时候a的值还是 不变的。
其他的情况:
public class Main { public static void main(String[] args) { String a="zkj"; System.out.println("str :"); strTest(a); System.out.println("str :"); StringBuffer sb=new StringBuffer("zkj,"); objTest(sb); System.out.println("obj :"+sb.toString()); final StringBuffer s=new StringBuffer("aa"); System.out.println(s); s.append("bb"); System.out.println(s); } public static void strTest(String b){ //这里b的地址指向main方法中a的地址 b="hello,"+b; //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b System.out.println(b); } public static void objTest(StringBuffer a){ a.append("hahah"); System.out.println(a.toString()); } }
这里打印:
zkj,hahah
新增了一个StringBuffer对象sb,学习过jvm的就了解,这里会在栈中生成一个sb,堆中生成一个“zkj,”对象,sb引用这个堆中的地址。调用ojbTest方法后,sb新增了字符串hahah,堆中的sb对象增加了这个string.
那什么时候可以像上例中String赋值一样,sb的值保持不变呢?
很简单,类似上例,我们也新建一个对象。 在ojbTest中。
public static void objTest(StringBuffer a){ a=new StringBuffer(); a.append("hahah"); System.out.println(a.toString()); }
这样main中就会打印: zkj,
解释如同上例。