Java的值传递

这边要学习的值传递有两种,基本类型值传递,对象值传递,分为下列四种
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的值传递)