zoukankan      html  css  js  c++  java
  • java方法参数传递方式只有----值传递!

      在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中,

    在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影响到实

    际参数本身。但是,在java中只有值传递,没有引用传递!那么,为什么当方法参数是基本数据类型时表现是值传递,

    而当是引用类型时表现的是引用传递形式呢?

      Java内存区域中含有java堆和虚拟机栈两个内存区域(并不是只是将java内存区分为这两个内存区域,此外还有程

    序计数器,本地方法栈以及方法区),java堆的目的就是为了存放对象,当一个方法执行时,每个方法都会为自己建立

    内存栈,用于存放方法内定义的变量等信息,当方法结束,这个方法的内存栈也会被销毁。

      总的来说,java方法运行时存放在栈中而对象本身存在堆中。下面将用两个例子来叙述当方法参数是基本数据类型

    时和引用类型时java的值传递过程。

      方法参数为基本数据类型时:

     

       可以看出,在main方法中调用swap方法传递的a,b参数仅仅是a,b副本,并不不是a,b本身,下面将java内存空间的

    情况,进一步说明java方法参数的值传递。

      当main方法开始执行时,创建main方法栈,栈中存储了a,b两个变量,值分别为9,20。main调用swap方法,并传递a,

    b的副本给swap方法,swap方法创建自己的栈区,里面有a,b和temp,此时的内存区中存在5个临时变量,在swap中将a,b

    进行交换,当swap方法结束后,swap栈区被销毁,从始至终,main栈区中的a,b未受到影响,直至main方法结束,main栈

    区销毁。所以java传递的只是参数的副本而非参数本身。

      而当参数是引用类型时:

     

       从上面的例子看出,当参数类型为引用时,原始参数受到了影响,那是否就是进行了引用传递呢?答案是否定的,参数

    还是进行的值传递。

       在main方法中有testValueTransfer引用变量,它保存在main方法栈中,新new的TestValueTransfer对象则保存在java堆中

    ,testValueTransfer实际存储的是对象的地址指向对象。当在main方法中调用swap方法时,传递的是testValueTransfer引用变

    量的副本,此时内存区中存在两个变量指向TestValueTransfer对象,当在swap方法中交换对象中的a,b成员变量时,实际操作

    的是对象本身,因此当swap方法结束后,main方法中testValueTransfer指向的对象发生了变化。

       总结:java参数传递方式只有值传递一种方式而已,传递的参数一直都是原始参数的副本。

  • 相关阅读:
    gitea (git服务器), 修改配置,更换IP地址
    使用ffmpeg裁剪和合并视频
    linux/windows/Mac平台生成随机数的不同方法
    Android源代码同步脚本(增加设置线程参数)
    小米2S Mk6.0.1 [只能做测试体验,不能使用]
    MultiROM for the XIAOMI MI2S/2C/2! (Kexec HardBoot Enabled with Kexec HardBoot Patch!)
    [PATCH] UBUNTU: SAUCE: (no-up) apparmor: Sync to apparmor3
    [转载]起动service保存android系统log( logcat服务)
    小米2S TWRP 3.0.2-0 最新中文版本Recovery
    centos 64位编译安装 glibc-2.14
  • 原文地址:https://www.cnblogs.com/lin0/p/12356607.html
Copyright © 2011-2022 走看看