Java 易混淆系列:Java的值传递和地址传递

本文探讨了Java中参数传递的区别,对于基本数据类型,传递的是值,不会影响原始值;而对于引用数据类型,如对象、数组等,传递的是引用,改变参数将影响原始内容。

前提

        本案例基于JDK1.8

结论

        基本数据类型作为方法参数传递是值传递,改变参数值不会影响到原始值

        引用数据类型,比如普通对象、对象/基本数据类型列表、对象/基本数据类型数组等作为参数传递,通过参数改变其内容,原始引用内容也会被修改,是地址(引用)传递

案例代码

  public static void main(String[] args) {
        int num = 0;
        System.out.println("基本数据类型===开始");
        System.out.println("基本数据类型-int修改前:" + num);
        modifyBasicType(num);
        System.out.println("基本数据类型-int修改后:" + num);
        System.out.println("基本数据类型===结束");
        System.out.println();
        
        System.out.println("引用数据类型===开始");
        Parent parent = new Parent();
        System.out.println("引用数据类型-对象-修改前:" + parent.getNum());
        modifyTyRefObjectType(parent);
        System.out.println("引用数据类型-对象-修改后:" + parent.getNum());
        System.out.println();
        
        int[] ints =new int[1];
        System.out.println("基本数据类型-int数组-修改前:" + ints[0]);
        modifyBasicArrayType(ints);
        System.out.println("基本数据类型-int数组-修改后:" + ints[0]);
        System.out.println();
        
        Parent[] parents = new Parent[1];
        parents[0]=new Parent();
        System.out.println("引用数据类型-数组中对象-修改前:" + parents[0].getNum());
        modifyTyRefArrayType(parents);
        System.out.println("引用数据类型-数组中对象-修改后:" + parents[0].getNum());
        System.out.println();
        
        List<Parent> list = new ArrayList<>();
        list.add(new Parent());
        System.out.println("引用数据类型-列表中对象-修改前:" + list.get(0).getNum());
        modifyTyRefListType(list);
        System.out.println("引用数据类型-列表中对象-修改后:" + list.get(0).getNum());
        System.out.println();
        
        list.get(0).child = new Parent.Child();
        System.out.println("引用数据类型-列表中对象子对象-修改前:" + list.get(0).getChild().getChildNum());
        modifyTyRefListType2(list);
        System.out.println("引用数据类型-列表中对象子对象-修改后:" + list.get(0).getChild().getChildNum());
        System.out.println("引用数据类型===结束");

    }

    private static void modifyBasicType(int num) {
        num = 9;
    }
    private static void modifyBasicArrayType(int[] array) {
        array[0] = 10;
    }

    private static void modifyTyRefObjectType(Parent parent) {
        parent.setNum(10);
    }

    private static void modifyTyRefArrayType(Parent[] array) {
        Parent test = array[0];
        test.setNum(10);
    }

    private static void modifyTyRefListType(List<Parent> list) {
        Parent test = list.get(0);
        test.setNum(10);
    }

    private static void modifyTyRefListType2(List<Parent> list) {
        Parent parent = list.get(0);
        Parent.Child child = parent.getChild();
        child.setChildNum(10);
    }

    public static class Parent {
        int num;
        Child child;

        public int getNum() {
            return num;
        }

        public void setNum(int num) {
            this.num = num;
        }

        public Child getChild() {
            return child;
        }

        public void setChild(Child child) {
            this.child = child;
        }

        public static class Child {

            int childNum;

            public void setChildNum(int childNum) {
                this.childNum = childNum;
            }

            public int getChildNum() {
                return childNum;
            }
        }
    }

输出结果

基本数据类型===开始
基本数据类型-int修改前:0
基本数据类型-int修改后:0
基本数据类型===结束

引用数据类型===开始
引用数据类型-对象-修改前:0
引用数据类型-对象-修改后:10

基本数据类型-int数组-修改前:0
基本数据类型-int数组-修改后:10

引用数据类型-数组中对象-修改前:0
引用数据类型-数组中对象-修改后:10

引用数据类型-列表中对象-修改前:0
引用数据类型-列表中对象-修改后:10

引用数据类型-列表中对象子对象-修改前:0
引用数据类型-列表中对象子对象-修改后:10
引用数据类型===结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值