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参数传递方式只有值传递一种方式而已,传递的参数一直都是原始参数的副本。
java方法参数传递方式只有----值传递!的更多相关文章
- 辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
- Java方法的参数传递方式为: 值传递
Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...
- 【转】java方法参数传递方式--按值传递、引用传递
java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...
- Java方法的参数传递是值传递还是引用传递?
当基本数据类型(Boolean,byte,char,String,int,Long,float,double)作为参数传递时,传递的是实参值的副本,即传的是值,无论在函数中怎么操作这个副本,实参的值是 ...
- JAVA方法中参数到底是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。
之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...
- Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java方法参数:
一个方法不能修改一个基本数据类型的参数 一个方法可以改变一个对象参数的状态 一个方法不能实现让对象参数引用一个新的对象 案例1: 一个方法不能修改一个基本数据类型的参数 String a = &quo ...
随机推荐
- 树上点分治 poj 1741
Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v ...
- 转:详解G1垃圾收集器
G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the dif ...
- @Controller和@RestController
@RestController=@Controller+@ResponseBody 1.使用RestController时,返回到前端的内容是Return里的内容,无法返回jsp/html等页面, 此 ...
- Java故障定位方法总结
多线程并发,程序执行速度较快,使用简单断点不能够定位到出错的线程: 通过打印日志,不断精确定位故障的位置和导致故障的原因. 在断点处设置condition为Thread.currentThread() ...
- python sys.modules 和 sys.path 及 __name__
1.sys.modules 存放已经缓存的模块 值是dict 2.sys.path 搜索路径 值是list 3.if __name__= __main__ 可以看成python的程序入口,如果直接执行 ...
- Java入门 - 面向对象 - 02.重写与重载
原文地址:http://www.work100.net/training/java-override-overload.html 更多教程:光束云 - 免费课程 重写与重载 序号 文内章节 视频 1 ...
- .net core ef动态orderby
前言 最近在给大家写一套开源的.net core权限管理框架.现在已经写到前台UI + 后台动态查询的部分. 发现需要动态orderby但是网上没有现成的例子 二话不说上代码 建议namespace ...
- ruby 模块 respond_to
def hi puts 'hi friend' end module Amodule def self.hello puts 'hello friend' end end def rsp(txt) p ...
- Exchange Server 2016 本地部署安装流程
思路:一台Server 2016用作AD+DNS,一台Server 2016用作Exchange Server 2016 Exchange Server 2016 CU14 安装路径:安装路径:htt ...
- RainbowPlan团队项目-总结
博客介绍 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作业要求在哪里 https:// ...