Java传值问题

前几天看【深入Java虚拟机】的时候看见关于Java的传值和传引用的问题,书上说Java一直都是传值的,而所谓的传引用实际上传的是“引用的值”(不是引用所指向的值),所以换句话说还是传值。

然后自己就做了几个测试

我先写了一个测试类


public class Test{

public static void main(String []args){
Integer a =5;
System.out.println(test(a));//6
System.out.println(a);//5
}

public static Integer test(Integer b){
    b++;
    return b;
}
}

开始我以为输出的都会是6,因为对于类来说传的都是“引用值”,就像下面的StringBuffer


public class Test1{
public static void main(String []args){
StringBuffer sb=new StringBuffer("asdf");
System.out.println(test(sb));//asdfh
System.out.println(sb);//asdfg
public static StringBuffer test(StringBuffer sb){
sb.append("h");}}

Integer和StringBuffer同样都是一个类,为什么前者就没有“传引用”的效果而后者就有呢?

后来在Java吧里问了一下
大致得出了结论

首先,由基本数据类型封装得来的类都是final,像String ,Long ,Integer…
所以他们的引用对象是不可以改变的,但是可以改变值,但是String,Long,Integer等类并没有提供内部方法来修改
引用所“指向”的值,而对于+或++等操作都是把结果重新放进一个new对象里,所以在test方法中Integer会重新new一个对象来存放结果
而对于StringBuffer来说,append()方法则是StringBuffer类的方法,专门用来修改内部值的,所以调用append时
引用不会变,但是,引用所指向的值变了,所以就达到了“传引用”的效果

你可能感兴趣的:(java,StringBuffer,传值,传引用)