Java方法中参数传递类型

准备写Java语法方面的各种知识点的理解,因此,参照 Java 核心技术上下两册,进行精读,从而整理出各个知识点,同时在本博中记录下亲测的结果,达到记忆的目的。

以下是两本书的豆瓣传送门,页面中有各种购买链接。

JAVA核心技术卷1

JAVA核心技术卷2

知识点 : Java方法的参数传递是基于值传递的

先看一下一个比较迷惑人的示例

//定义一个测试类,属性x,get set 方法, 初始值是 String类  "init"
class Sample {
    private String x;
    public Sample() {
        this.x = "init";
    }
    public String getX() {
        return this.x;
    }
    public void setX(String x) {
        this.x = x;
    }
}
//测试类
public class FuncParamDemo {
    public static void main(String[] args) {
        Sample sampleA = new Sample();
        System.out.println(sampleA.getX());
        FuncParamDemo.changeSample(sampleA);
        System.out.println(sampleA.getX());
    }
    public static void changeSample(Sample s) {
        s.setX("SampleA is changed...");
    }
}
//输出
init
SampleA is changed...

在测试类中定义一个改变参数内容的方法 , changeSample(Sample s), 传入sample 对象, 改变属性x。
传入前是初始值,执行方法后,sampleA 的属性被改变了。
注意,这里还是值传递!!
sampleA 有两部分组成,指针 和 对象 ,sampleA 这个指针被拷贝了, 变成 s, 因此, sampleA 和 s 是2个不同的指针,但是指向了同一个对象, 因此, 对象的属性x在执行完测试方法后被改变了。
因此,这里说的值传递,是对于指针(引用来说的)

第二个例子

//在测试类FuncParamDemo 中增加方法,进行一个对象互换的操作
public static void exchangeObj(Sample samplex, Sample sampley) {
    Sample temp = new Sample();
    temp = samplex;
    samplex = sampley;
    sampley = temp;
    System.out.println("Samplex now is " + samplex.getX());
    System.out.println("Sampley now is " + sampley.getX());
}

//测试类中main方法修改为
public static void main(String[] args) {
    Sample sampleA = new Sample();
    Sample sampleB = new Sample();

    sampleA.setX("Sample A");
    sampleB.setX("Sample B");
    System.out.println("sampleA is " + sampleA.getX());
    System.out.println("sampleB is " + sampleB.getX());

    FuncParamDemo.exchangeObj(sampleA, sampleB);

    System.out.println("sampleA now is " + sampleA.getX());
    System.out.println("sampleB now is " + sampleB.getX());
}
//输出
sampleA is Sample A
sampleB is Sample B

Samplex now is Sample B
Sampley now is Sample A

sampleA now is Sample A
sampleB now is Sample B

初始时 sampleA.x 为 Sample A, sampleB.x 为 Sample B
方法内部被2个对象互换成功。
最后打印sampleA.x sampleB.x为原来的值
因此,肯定不是引用传递,不然最后一步就不会那么打印了。
所以第一个例子的结论是正确的。