Java引用传递

Java数据有两个类型:基本类型、引用类型

 

基本类型

 

如上图所示,基本类型传递时,线程在栈上分配形式参数并拷贝实际参数的值。

 

    /**

     * Create with IntelliJ IDEA

     * Author               : wangzhenpeng

     * Date                 : 2018/4/8

     * Time                 : 上午9:48

     * E-mail               : wangzhenpeng0924@163.com

     * Description          : Test

     */

     

    public class Test {

        public static void main(String[] args) {

            int value = 100;

            change(value);

            System.out.println("outer: " +  value);

        }

     

        static void change(int value) {

            value = 200;

            System.out.println("inner: " +  value);

        }

     

    }

 

结果输出:

    inner: 200

    outer: 100

 

方法修改的只是形式参数,对实际参数没有作用。方法调用结束后形式参数随着栈帧回收。

 

引用类型

 

如上图所示,引用类型传递时,传递的是引用的值,从这个角度来讲还是值传递。如果是引用传递的话,传递的应该是引用的地址,而不是引用的值。

     

    public class Test {

        public static void main(String[] args) {

            Person person = new Person();

            person.setAge(17);

            person.setName("Tom");

            change(person);

     

            System.out.println("outer: " +  person.getAge());

     

        }

     

        static void change(Person value) {

            value.setAge(18);

            System.out.println("inner: " +  value.getAge());

        }

     

        static class Person {

            private String name;

            private Integer age;

     

            public String getName() {

                return name;

            }

     

            public void setName(String name) {

                this.name = name;

            }

     

            public Integer getAge() {

                return age;

            }

     

            public void setAge(Integer age) {

                this.age = age;

            }

        }

     

    }

 

结果输出:

    inner: 18

    outer: 18

 

方法修改的是引用所指向的数据空间的数据,所以方法外部也能看到修改的结果。

 

基本类型的数组也是对象,所以int[] 传递的也是对象应用的值。

     

    public class Test {

        public static void main(String[] args) {

            int[] intArray = new int[10];

            change(intArray);

            System.out.println("outer: " +  intArray[0]);

        }

        static void change(int[] value) {

            value[0] = 200;

            System.out.println("inner: " +  value[0]);

        }

    }

}

运行结果:

    inner: 200

    outer: 200

 

如果对引用类型的传递稍作修改

 

        static void change(Person value) {

            value = new Person();

            value.setAge(18);

            System.out.println("inner: " +  value.getAge());

        }

 

运行结果:

    inner: 18

    outer: 17

 

 

StringInteger等类型的封装类型为final类型,对数据的修改操作实际上是创建了一个新的对象

     

    public class Test {

        public static void main(String[] args) {

            String value = "123";

            change(value);

            System.out.println("outer: " + value);

        }

     

        static void change(String value) {

            value = "abc";

            System.out.println("inner: " +  value);

        }

    }

 

运行结果:

    inner: abc

    outer: 123

posted @ 2019-09-23 20:15  Qi-BJ  阅读(3021)  评论(0编辑  收藏  举报