请记住Java是值传递

Java是值传递!Java是值传递!Java是值传递!

值传递&引用传递

  • 值传递:将参数传入函数后,无论函数内部对参数进行了什么操作,跳出函数后,参数值依旧是原来的值,不会发生任何改变。
  • 引用传递:将参数传入函数后,函数内部对参数进行的修改会直接影响到外部。

接下来,我将用两个实验来证明Java是值传递。

实验1

public static void main(String[] args) {

        int a=10;
        System.out.println("a="+a);
        help(a);
        System.out.println("a="+a);
    }

    public static void help(int a){

        a+=10;
        System.out.println("a="+a);
    }

实验1的运行结果

a=10
a=20
a=10

从实验1的运行结果我们可以看到,我们在help接口内部对a进行了+10操作,但是当跳出接口后并没有对a产生影响,a依旧等于10.

实验2

public static void main(String[] args) {

        Demo demo1=new Demo();
        Demo demo2=new Demo();
        demo1.name="xiaohuanzi";
        demo1.age=25;
        demo2.name="congcong";
        demo2.age=18;
        System.out.println("demo1="+demo1.toString());
        System.out.println("demo2="+demo2.toString());
        help(demo1,demo2);
        System.out.println("demo1="+demo1.toString());
        System.out.println("demo2="+demo2.toString());
    }

    public static void help(Demo demo1,Demo demo2){

        Demo temp=demo1;
        demo1=demo2;
        demo2=temp;
        System.out.println("demo1="+demo1.toString());
        System.out.println("demo2="+demo2.toString());
    }

实验2的运行结果

demo1=Demo{name='xiaohuanzi', age=25}
demo2=Demo{name='congcong', age=18}
demo1=Demo{name='congcong', age=18}
demo2=Demo{name='xiaohuanzi', age=25}
demo1=Demo{name='xiaohuanzi', age=25}
demo2=Demo{name='congcong', age=18}

通过实验2的运行结果我们发现,当参数是引用类型是,内部的对参数的修改依旧不会对外部产生影响。

深入理解Java的值传递

虽说Java是值传递,但是也会有引用传递的效果,因为Java的值传递的那个值是地址。来,让我们看个实验。

实验3

public static void main(String[] args) {

        int[] arr={0,1,2,3,4,5};
        System.out.println("arr="+ Arrays.toString(arr));
        help(arr);
        System.out.println("arr="+ Arrays.toString(arr));
    }

    public static void help(int[] arr){

        for(int i=0;i<arr.length;i++){
            arr[i]+=10;
        }
    }

实验3运行结果

arr=[0, 1, 2, 3, 4, 5]
arr=[10, 11, 12, 13, 14, 15]

通过实验3的运行结果我们发现,help接口对数组进行修改真正影响到了arr。让我们来分析一下。

图1 实验3内存分析

因为Java对于引用类型的参数传递的是地址,因此形参arr也是指向数组,因此对形参的修改直接会影响到数组。

那实验二是什么情况呢?我们来分析一下。

图2 实验2内存分析

实参和型参demo1都指向“xiaohuanzi”,实参和形参demo2都指向“congcong”,当形参demo1和demo2交换后,形参demo1指向“congcong”,形参demo2指向“xiaohuanzi”,但是实参demo1和demo2依旧是原来的指向并没有改变,这也就说通了实验2的运行结果,同时也更加说明,Java是值传递而不是引用传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值