美文网首页
对象传参后值的变化

对象传参后值的变化

作者: 很很狠的狠角色 | 来源:发表于2017-10-19 20:05 被阅读0次
    public class Problem01 {
        public static void main(String[] args) {
            A a1 = new A();
            A a2 = new A();
            A a3 = new A();
            System.out.println(a1 + " " + a2);
            swap(a1, a2);
            System.out.println(a1 + " " + a2);
            System.out.println(a3.a);
            assignment(a3);
            System.out.println(a3.a);
        }
    
        private static void swap(A a1, A a2) {
            A a = new A();
            a = a1;
            a1 = a2;
            a2 = a;
            System.out.println(a1 + " " + a2);
        }
    
        private static void assignment(A aa) {
            aa.a = 8;
        }
    }
    
    class A {
        int a = 10;
    }
    
    代码运行结果

    在java里传参传递的都是值:

    • 基本数据类型传递的是数据的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个不同的变量,方法体内部的变量的改动不会影响方法体外部的变量。
    • 引用数据类型传递的是所引用的对象的地址的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个相同的变量,方法体内部变量的改动会影响方法体外部的变量。
         java程序设计语言总是采用按值调用,方法得到的所有参数值都是变量的拷贝。基本数据类型传递的是数据本身的拷贝,引用类型传递的是引用所对应对象的地址的拷贝。
        数据传参想必大家都很熟悉了,那就看一下数据类型的引用传参。在assignment()方法体中传入的参数不是基本数据类型,是A类型的一个实例,从输出结果可以看到a的值发生了变化。
        再来看看引用传参。上面代码中swap(a1,a2)开始传递参数的时候,在swap方法的栈内存中就会出现方法外部对象a1和a2的所引用对象的地址值的复制体a1和a2.这时进行交换操作,致使方法体内部的a1实际引用的是外部的a2,内部的a2实际引用的是外部的a1。所以方法体内部打印a1和a2所引用的对象的值和外部的a1和a2是相反的,并且,外部的a1和a2的值在调用swap方法前后所引用的对象并没有变化。

    总结:

    1. 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
    2. 一个方法可以改变一个对象参数的状态。
      状态是指对象的实例域,比如,上面的a3.a就被改变了。
    3. 一个方法不能让对象参数引用一个新的对象。
      比如,上面的swap()方法就没改变a1和a2的引用对象。(但是不经过方法,直接在main()方法里用赋值语句就可以改变)

    相关文章

      网友评论

          本文标题:对象传参后值的变化

          本文链接:https://www.haomeiwen.com/subject/yldpuxtx.html