zoukankan      html  css  js  c++  java
  • Java的参数传递是值传递?

    引用传递和值传递的区别。(不先说定义的都是在耍流氓!)

    按值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间。形参所存储的内容是实参存储内容的一份拷贝。

    按引用调用:在参数传递的过程中,形参和实参完全是同一块内存空间,两者不分彼此。

    咱们先看俩行代码:

    如图,int是基本类型,66直接保存在变量count中。而对于引用类型来说,变量存的是实例对象的地址,如上图也画的0x10一样,它指向实例对象。一般称这种变量为"引用"。对于我们的String str = "MDove"来说,str就是这个引用,这个引用指向了"MDove"。

    赋值符号对于基本类型和引用类型的不同之处。再看一段代码:

    由上图,我们可以看出,对于基本类型来说,count = 666;是直接进行赋值。而str = "MDove is cool.";则是重新开辟了一块空间,然后将这块空间的地址赋值给str变量(引用)。

    基本类型就是值传递,比如这样的:

     

    因为是值传递,所以在fun(int coount)中,count只是真正变量的拷贝,因此count = 666;也是对拷贝进行赋值,因此执行完了fun方法,我们的count还是等于66。

    那我们在换一个例子,把基本类型改为引用类型:

    答案还是"MDove"(如果感觉有点懵,可以把前后的两个对象取出来 equal比较一下)

    按我的理解方法参数都是引用类型了,那应该是引用传递,内部str赋值应该会影响外边才对啊!

    其实上面这个例子也恰恰应征了这个问题,引用类型同样也是值传递。因此fun参数的str,依然是一个拷贝,因此此时的赋值对面来说没有任何意义。其中,IDE也帮我们证实了这个问题,让我们看一张截图:

    如果是这种写法,就改变了变量的值了:

    MDove:这样当然能改变值,对于引用变量来说,值传递,拷贝了它的引用,但是它的这份拷贝的引用所指向的真实地址是没变的。上述的操作画成图是这个样子:

     

    所以 java是值传递,如果我解释的不清楚  请点击http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html

     

     

  • 相关阅读:
    用故事说透 HTTPS
    nginx部署基于http负载均衡器
    Jenkins使用docker-maven-plugin进行编译时发现没有权限
    Jenkins执行mvn -f ${project_name} clean package报错:找不到父工程
    Harbor的镜像上传和拉取
    java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
    Jenkins+SonarQube代码审查
    Centos7安装SonarQube7.9.3
    Centos7 rpm 安装Mysql5.7
    Jenkins 配置邮箱服务器发送构建结果
  • 原文地址:https://www.cnblogs.com/smellpawn/p/10797286.html
Copyright © 2011-2022 走看看