java参数是传值还是传引用这个问题,就像豆包是不是干粮一样,众说纷云,哈哈,但是不管java参数的类型到底是什么,一律是传递的参数的副本.也就是如果java传递的是值,那么传递的是值得副本,如果传递的是引用,那么传递的是引用的副本。
首先来了解一下:
java中数据类型分为基本数据类型和引用数据类型,基本数据类型在栈内存中,传递的是值,引用数据类型在堆内存中,传递的是地址,为什么呢?因为引用类型比较大,就像一个仓库,你没必要给别人一个仓库,只需要给别人一个钥匙就好了,所以基本数据类型就算是副本改变了,自己也不会改变,说了这么多,写几个Demo看一下实例:

public class Test1 {
    public static void main(String[] args) {
        int i = 1;
        System.out.println(i);
        fun(i);
        System.out.println(i);
    }
    public static void fun(int i){
        i = 5;
    }
}

结果是:

1
1

通过这个例子可以看出,fun方法改变了传进来的参数值,但是对原来的参数并没有改变,只是改变了i的一个副本。

java 传到基本类型 java传递数据_System

public class Test2 {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("Hello");
        fun(str);
        System.out.println(str);
    }
    public static void fun(StringBuffer str){
        str.append(", World");
    }
}

结果:

Hello, World

为什么呢?

fun(str)调用了fun(StringBffer)方法,并将String作为参数传递了进去,这里的str是一个引用,java对于引用形式传递对象类型的变量时,实际上是将引用作为副本传递进去的,那么这个函数里面的引用副本所指向的是对象的地址,通过副本找到地址,并且进行了修改,就相当于修改了对象。

java 传到基本类型 java传递数据_java_02

public class Test03 {

    public static void main(String[] args) {
        Test t = new Test();
        t.first();
    }

    public void first() {
        int i= 5;
        Value v= new Value();
        v.i = 25;
        second(v, i);
        System.out.println("  "+v.i);
    }

    public void second(Value v, int i){
        i =0;
        //通过引用的副本改变了原对象的值为20
        v.i = 20;
        //new出了一个新的对象
        Value val = new Value();
        //引用的副本指向了新的Object
        v = val;
//      val = v;
        //打印出新对象的值
        System.out.print(v.i + " "+i);
    }
}

class Value {
    public int i = 15;
}

执行结果:

15 0  20

对象v传递的是一份引用的副本,v.i=20,通过引用的副本改变了元对象的值为20,Value val = new Value();中,new引出了一个新的对象,然后执行v=val,相当于引用的副本指向了一个新的Object,所以,v.i=15是改变了新的Object的值,而不改变原对象的值。

java 传到基本类型 java传递数据_java 传到基本类型_03


可能还有很多纰漏,请大家指导,我会及时评论。