黑马程序员技术交流社区

标题: java中方法参数按值传递 [打印本页]

作者: 新手ing    时间: 2015-7-14 10:15
标题: java中方法参数按值传递
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、一个方法不能让传递的引用指向新的对象。









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2