美文网首页
Java的值传递

Java的值传递

作者: Is_Poson | 来源:发表于2018-07-31 10:29 被阅读0次

    这边要学习的值传递有两种,基本类型值传递,对象值传递,分为下列四种
    1.方法块内的基本类型值传递
    2.方法块内的对象值传递
    3.方法间的基本类型值传递
    4.方法间的对象值传递
    4.1 改变参数变量的属性
    4.2 改变参数变量指向的地址
    4.3 成员变量作为外部变量传参之后,在方法块内更改其地址

    先给予总结:
    -->>不管是基本类型值传递还是对象值传递,都是进行"拷贝"操作,外部变量与方法的参数要分开来考虑,
    1.基本类型值传递时直接拷贝一份值给方法参数
    2.对象传递时直接拷贝一份对象内存地址给方法参数,因为两者(外部对象,方法参数)持有的内存地址指向同一份内存,在参数改变某个属性时,方法参数指向的内存属性改变,外部对象通过相同内存地址指向了相同的内存,拿到的自然是改变之后的值
    3.由2可知,两者(外部对象/方法参数)所持有的内存地址是同样的,但也是相互独立的,是可以各自改变的,方法参数要是被一个新的对象赋值,他的地址
    4.能证明地址拷贝的是4.3

    1.方法块内的基本类型值传递

    int i = 2;
    int b = i;
    结果
    /**
      i  --> 2
      b --> 2;
    */
    

    2.方法块内的对象值传递

    /**
             * 总结:两个局部变量将指向同一个内存地址
            xiaowang:  xiaowang
            xiaowang内存地址:  insert.VariableAddress$Person@14318bb
            xiaosheng内存地址:  insert.VariableAddress$Person@14318bb
            xiaosheng: xiaowang
            xiaowang: xiaowang
            xiaosheng: xiaosheng
            xiaowang: xiaosheng
    */
            Person xiaowang = new Person("xiaowang");
            System.out.println("xiaowang:  " + xiaowang.getName());
            Person xiaosheng = xiaowang;
            System.out.println("xiaowang内存地址:  " + xiaowang.toString());
            System.out.println("xiaosheng内存地址:  " + xiaosheng.toString());
            System.out.println("xiaosheng: " + xiaosheng.getName());
            System.out.println("xiaowang: " + xiaowang.getName());
            xiaosheng.setName("xiaosheng");
            System.out.println("xiaosheng: " + xiaosheng.getName());
            System.out.println("xiaowang: " + xiaowang.getName());
    

    3.方法间的基本类型值传递

    /**
     *      总结:基本类型值的传递只会将值拷贝给方法
            value:  1
            value:  9
            c:  1
     */
            int c = 1;
            change4(c);
            System.out.println("c:  " + String.valueOf(c));
    
    public static void change4(int value){
            System.out.println("value:  " + String.valueOf(value));
            value = 9;
            System.out.println("value:  " + String.valueOf(value));
    }
    

    4.方法间的对象值传递
    4.1 改变参数变量的属性

    /**
             * 总结:方法块内能更改外部对象的属性值
             *  xiaoying内存地址:  insert.VariableAddress$Person@10b30a7
                person内存地址:  insert.VariableAddress$Person@10b30a7
                xiaogan内存地址:  insert.VariableAddress$Person@10b30a7
                person方法内: xiaoying
                xiaogan: xiaoying
                person方法内: xiaogan
                xiaogan: xiaogan
                xiaoying方法外: xiaogan
             */
            Person xiaoying = new Person("xiaoying");
            System.out.println("xiaoying内存地址:  " + xiaoying.toString());
            change1(xiaoying);
            System.out.println("xiaoying方法外: " + xiaoying.getName());
    
    public static void change1(Person person){
            System.out.println("person内存地址:  " + person.toString());
            Person xiaogan = person;
            System.out.println("xiaogan内存地址:  " + xiaogan.toString());
            System.out.println("person方法内: " + person.getName());
            System.out.println("xiaogan: " + xiaogan.getName());
            xiaogan.setName("xiaogan");
            System.out.println("person方法内: " + person.getName());
            System.out.println("xiaogan: " + xiaogan.getName());
        }
    

    4.2 改变参数变量指向的地址

    /**
             * 现象:参数对象地址与外部对象地址一致,可是重新给参数赋予新的对象地址,外部对象地址并不会改变
               总结:外部对象只是将地址值拷贝一份给了参数变量,参数变量与外部变量无关
             *  xiaohuang内存地址:  insert.VariableAddress$Person@1a758cb
                xiaoli内存地址:  insert.VariableAddress$Person@1b67f74
                person内存地址:  insert.VariableAddress$Person@1b67f74
                xiaohuang内存地址:  insert.VariableAddress$Person@1a758cb
             */
            Person xiaohuang = new Person("xiaohuang");
            System.out.println("xiaohuang内存地址:  " + xiaohuang.toString());
            change2(xiaohuang);
            System.out.println("xiaohuang内存地址:  " + xiaohuang.toString());
    
    public static void change2(Person person){
            //将一个新的地址值传给传进来的对象
            Person xiaoli = new Person("xiaoli");
            System.out.println("xiaoli内存地址:  " + xiaoli.toString());
            person = xiaoli;
            System.out.println("person内存地址:  " + xiaoli.toString());
        }
    

    4.3 成员变量作为外部变量传参之后,在方法块内更改其地址

    /**
        总结:成员变量作为参数传入,打印成员变量与参数的内存地址,随机更改成员变量的内存地址,发现参数的内存地址并没有改变
          person内存地址:  insert.VariableAddress$Person@14318bb
          parent内存地址:  insert.VariableAddress$Person@14318bb
          person内存地址:  insert.VariableAddress$Person@14318bb
          parent内存地址:  insert.VariableAddress$Person@1b67f74
    */
    
    成员变量:
    private static Person parent = new VariableAddress.Person("parent");
    
    作为参数传入
    change5(parent);
    
    public static void change5(Person person){
            System.out.println("person内存地址:  " + person.toString());
            System.out.println("parent内存地址:  " + parent.toString());
            parent = new Person("main");
            System.out.println("person内存地址:  " + person.toString());
            System.out.println("parent内存地址:  " + parent.toString());
        }
    

    相关文章

      网友评论

          本文标题:Java的值传递

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