栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于java值传递和引用传递的理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于java值传递和引用传递的理解

1,按值调用:表示方法接收的是调用者提供的值;参数=变量值

     按引用调用:表示方法接收的是调用者提供的变量地址:参数=指向变量值的引用

2,方法可以修改传递引用对应的变量值,但是不能修改传递值对应的变量值

3,Java总是采用按值调用,方法得到的是所有参数值的一个拷贝,也就是说不能修改这个拷贝的值

4,来个例子:

public static void triple(double x){
   x=a*x;
}

//执行
double per=3;
triple(per);

执行了triple()方法,per的值还是3,看一下流程:

      x被初始化为per值的一个拷贝(3)

      x被乘以3后等于9,但是呢,per还是3

      方法结束后,参数x不再使用

方法参数有两种类型:

      基本数据类型(数字,布尔)

      对象引用

可以看到,一个方法不可能修改一个基本数据类型的参数,但是对象作为引用就不同了:

//class=Boss
public static void tripleSalary(Emplyee x){
   x.money=x.money*2;
}

Boss b=new Boss();
Emplyee  e=new Emplyee ();
b.tripleSalary(e); //老板给指定员工涨双倍工资

执行过程为:

        x被初始化为对e值的拷贝,这里是一个对象的引用(简单说就是方法得到的就是对象引用的拷贝,对象引用及其他拷贝同时引用同一个对象)

        tripleSalary()方法应用于这个对象引用,此时,x和e同时引用的这个对象的工资提高了两倍

        方法结束后,参数变量x不再使用,但是e继续引用着这个涨了双倍工资的雇员对象。

切记:java看上去对对象的引用是引用调用,但是这是错的:

//假设java对对象是引用调用,class=Boss
public static void swap(Emplyee a,Emplyee b){
     Emplyee temp =a;
     a=b;
     b=temp;
 }


Emplyee N=new Emplyee (“Newton”);
Emplyee M=new Emplyee (“Martin”);
Boss.swap(N,M);

如果java的引用是对象引用,那么这个方法就能实现交换:N->Martin;M->Newton,但是在方法结束时,参数变量a,b被舍弃,交换失败:可以如下理解:

        方法定义的形参a,b就像第二个图的x

        调用方法时:

              第二个图的x拷贝了e的引用

              这个图的a,b,拷贝了N,M的引用

             方法调用结束,x,a,b都失去作用,而第3点提到:Java总是采用按值调用,方法得到的是所有参数值的一个拷贝,也就是说不能修改这个拷贝的值,因此,N,M的值(对象引用的拷贝)也就不会发生变换;

            特别提一下不可变字符串String和可变字符串StringBuilder:

    public void sum(StringBuilder name){
        name.append("a");
    }
    public void sum1(String name){
        name.concat("a");
    }

这两个方法分别调用,String对象不会加"a",而StringBuilder会加"a"。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号