首先看一下面试中遇到的一道题
public class StringBufferTest {
public static void main(String[] args){
StringBuffer A = new StringBuffer("A");
StringBuffer B = new StringBuffer("B");
operator(A,B);
System.out.println(A);
System.out.println(B);
}
public static void operator(StringBuffer x, StringBuffer y){
x = x.append(y);
y = x;
}
}
对于这道题的输出是什么呢?
(A) AB AB
(B) AB A
(C) A A
(D) AB B
看看Java中的方法参数传值方式
Java总是采用按值调用。也就是说,方法得到的是所有参数值得一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
方法参数共有两种类型:
- 基本数据类型(数字,布尔值),这种方式是直接拷贝参数,传递副本。
- 对象引用,这种方式是拷贝引用的地址,传递对象的引用。
有些程序员认为Java对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。
首先,编写一个交换两个雇员对象的方法:
public class Employee {
private String name;
private Integer age;
public Employee(String name, Integer age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Employee a = new Employee("Alice",20);
Employee b = new Employee("Bob",32);
swap(a,b);
System.out.println(a.name);
System.out.println(b.name);
}
public static void swap(Employee x, Employee y) {
Employee temp = x;
x = y;
y = temp;
}
}
如果Java对对象采用的是引用调用,那么执行上面的main方法,将能够实现交换数据的效果。
但是,方法并没有改变存储在 a 和 b 中的对象引用。swap 方法的参数 x 和 y 初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
最终,白费力气。在方法结束时参数变量 x 和 y 被丢弃了。原来的变量 a 和 b 仍然引用这个方法调用之前所引用的对象,如下图:
这个过程说明:Java对对象采用的不是引用调用,实际上,对象引用进行的是值传递。
下面总结一下Java程序设计语言方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。
网友评论