Java类和对象-参数的传递

首先要明确的是JAVA中没有引用传递, 全部是按值调用

基本数据类型作为参数传递

基本数据类型作为参数传递时都是传递值的拷贝。 指的是方法调用中,传递的是值的拷贝,无论怎么改变这个拷贝,原值是不会改变的。

也即是说实参把它的值传递给形参,对形参的改变不会影响实参的值。

public class Test {
    public static void main(String[] args) {
        Test test1 = new Test();
        int i = 5;
        System.out.println("调用前的i=" + i);
        test1.testPassParameter(i);
        //传递后,testPassParameter方法中对形参i的改变不会影响这里的i
        System.out.println("调用后的i=" + i);
    }
    public void testPassParameter(int i) {
        i = 10;//这里只是对形参的改变
        System.out.println("tpp方法中的i=" + i);
    }
}

输出结果:

调用前的i=5
tpp方法中的i=10
调用后的i=5

对象作为参数传递

对象作为参数传递时,在方法内改变对象的值,有时原对象跟着改变,而有时又没有改变。就会让人对“传值”和“传引用”产生疑惑。

先看看两种情况的例子。

public class Test {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hello");
        changeStringBuffer(s1, s2);
        System.out.println("s1=" + s1);
        System.out.println("s2=" + s2);
    }
    public static void changeStringBuffer(StringBuffer ss1, StringBuffer ss2) {
        ss1.append("world");
        ss2 = ss1;
    }
}

输出结果:

s1=helloworld  
s2=hello

分析如下:

//(1)s1,s2指向字符串的地址不同,假设为地址1,地址2
StringBuffer s1 = new StringBuffer("hello");
StringBuffer s2 = new StringBuffer("hello");

//(2)调用changeStringBuffer方法
changeStringBuffer(s1, s2);
//调用后会将s1,s2的地址(地址1,地址2)传给ss1,ss2,即现在ss1也指向地址1,ss2也指向地址2

//(3)ss1所指向字符串的值变为helloworld,调用者s1的值相应变化。
ss1.append("world");
//ss2将指向ss1指向的地址(地址1),但此时s2依旧指向地址2,s2的值在调用前后不变。
ss2 = ss1;

所以,s1的输出为helloworld,s2的输出结果为hello。

注意:这里为了区分,s1,s2和ss1,ss2用了不同的名称,但有时候形参与实参的名字相同,其实两者变量是完全不同的,一个是main方法中的变量,一个是changeStringBuffer()中的变量。

可以看出,在java中对象作为参数传递时,传递的是引用的地址,是把对象在内存中的地址拷贝了一份传给了参数。

文章目录