准备写Java语法方面的各种知识点的理解,因此,参照 Java 核心技术上下两册,进行精读,从而整理出各个知识点,同时在本博中记录下亲测的结果,达到记忆的目的。
以下是两本书的豆瓣传送门,页面中有各种购买链接。
知识点 : 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为原来的值
因此,肯定不是引用传递,不然最后一步就不会那么打印了。
所以第一个例子的结论是正确的。