1、Java中的参数分为两种类型:基本数据类型和对象引用
看一个示例
public class Demo {
public static void main(String[] args) {
int a = 3;
changeValue(a);
System.out.println("a = "+a)
}
public static void changeValue(int a){
a = 4;
System.out.println("a = "+a); }
}
输出
a = 4
a = 3
可以看到,虽然调用了changeValue静态方法,但a的值并没有改变,因为java是按值传递,当调用完changeValue方法,a = 4消失。所以a的值仍然为3。这点和C语言是一致的。
2、再来看一个例子:引用传递
public class Demo2 {
/**
* java中的按值传递
*/
public static void main(String[] args) {
A a1 = new A();
a1.a = 2;
System.out.println("a1.a = "+a1.a);
changeValue(a1);
System.out.println("a1.a = "+a1.a);
}
public static void changeValue(A a){
a.a = 5;
}
}
class A{
public int a ;
}
输出结果
a1.a = 2
a1.a = 5
分析:实际上当传递的参数是方对象,方法能够改变对象的成员变量的值这点是毋庸置疑的。所以changeValue方法改变了对象的值。但是,这里所说的按值传递指的是:对象引用的按值传递。即你无法使该引用指向一个新的对象。
再来看一个例子
public class Demo3 {
/**
* java中的按值传递
*/
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
a1.a = 2;
a2.a = 3;
System.out.println("a1.a = "+a1.a);
System.out.println("a2.a = "+a2.a);
changeValue(a1,a2);
System.out.println("a1.a = "+a1.a);
System.out.println("a2.a = "+a2.a);
}
//试图改变a1 和a2的引用
public static void changeValue(A a1,A a2){
A temp = a1;
a1 = a2;
a2 = a1;
}
}
class A{
public int a ;
}
输出结果
a1.a = 2
a2.a = 3
a1.a = 2
a2.a = 3
不难看出,对象的引用没有完成交换,所以输出的值不变。
综上
1、一个方法不能修改基本类型参数的值。
2、方法可以改变传递的对象参数的成员变量值。
3、一个方法不能让传递的引用指向新的对象。
|
|