按值调用 ( call by value ) 表示方法接收的是调用者提供的值。 而按引用调用( call by reference )表示方法接收的是调用者提供的变量地址。 一个方法可以修改传递引用所对应的变量值 , 而不能修改传递值调用所对应的变量值。Java 程序设计语言总是采用按值调用。
1、方法参数为基本数据类型
public static strictfp void main(String[] args) {
int x = 1;
int y = 2;
swap(x, y);
System.out.println("x:"+x+",y:"+y);
}
public static void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
执行如上代码:swap方法并未改变x,y的值,执行完swap方法后,swap弹栈,变量temp,a,b随之消失。
2、方法参数为对象引用
public static strictfp void main(String[] args) {
Person x = new Person("张三");
change(x);
System.out.println("x:"+x.name);
}
private static void change(Person a) {
a.name = "李四";
}
a为x值的一个拷贝,这里是一个对象引用,a和x同时指向一个Person对象。
执行如上代码:
3、证明java是按值调用
public static strictfp void main(String[] args) {
Person x = new Person("张三");
Person y = new Person("李四");
swap(x, y);
System.out.println("x:"+x.name+",y:"+y.name);
}
public static void swap(Person a,Person b){
Person temp = a;
a = b;
b = temp;
}
方法并没有改变存储在变量 x 和 y 中的对象引用 结果如下:
在swap方法结束时参数变量a 和 b 被丢弃了
下面总结一下 Java 中方法参数的使用情况 :
• 一个方法不能修改一个基本数据类型的参数 ( 即数值型或布尔型 ) 。
• 一个方法可以改变一个对象参数的状态 。
•一个方法不能让对象参数引用一个新的对象。
实力:
public class IoTest {
public static void main(String[] args) throws IOException {
List<String> a = null;
test(a);
System.out.println(a.size());
}
public static void test(List<String> a) {
a = new ArrayList<String>();
a.add("abc");
}
}
执行test(a)之后,a的引用指向的还是 null;
结果:
实例:
public class IoTest {
public static void main(String[] args) throws IOException {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a,b);
System.out.println(a+","+b);
}
public static void operator(StringBuffer x,StringBuffer y){
x.append(y);//x引用所指向的对象其中的值被改变
y=x;//y引用所指向的对象不会发生变化
}
}
结果: