-
值传递与引用传递的区别
2020-08-16 18:21:36值传递与引用传递的区别 值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时 的 存储单元(方法内的局部变量),因此性参与实参虽然有着相同的值,但是却有着不用的 存储单 元,... -
java值传递与引用传递的区别
2017-02-06 16:22:12java值传递与引用传递的区别前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有人说Java只有值传递,但有人说既有值传递,也有引用传递,对于两个观点个人觉得应该是站的角度不同而得出两个不同的说法,其实两个说法其中的原理是一样的,只要咱们懂得其中的原理,那么至于叫什么也就无所谓了,下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考:
1:按值传递是什么
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
- public class TempTest {
- private void test1(int a){
- //做点事情
- }
- public static void main(String[] args) {
- TempTest t = new TempTest();
- int a = 3;
- t.test1(a);//这里传递的参数a就是按值传递
- }
- }
按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
示例如下:
- public class TempTest {
- private void test1(int a){
- a = 5;
- System.out.println("test1方法中的a="+a);
- }
- public static void main(String[] args) {
- TempTest t = new TempTest();
- int a = 3;
- t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
- System.out.println(”main方法中的a=”+a);
- }
- }
运行结果是:
- test1方法中的a=5
- main方法中的a=3
2:按引用传递是什么
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
示例如下:
- public class TempTest {
- private void test1(A a){
- }
- public static void main(String[] args) {
- TempTest t = new TempTest();
- A a = new A();
- t.test1(a); //这里传递的参数a就是按引用传递
- }
- }
- class A{
- public int age = 0;
- }
3:按引用传递的重要特点
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例如下:
- public class TempTest {
- private void test1(A a){
- a.age = 20;
- System.out.println("test1方法中的age="+a.age);
- }
- public static void main(String[] args) {
- TempTest t = new TempTest();
- A a = new A();
- a.age = 10;
- t.test1(a);
- System.out.println(”main方法中的age=”+a.age);
- }
- }
- class A{
- public int age = 0;
- }
运行结果如下:
- test1方法中的age=20
- main方法中的age=20
4:理解按引用传递的过程——内存分配示意图
要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:
(1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:
(2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:
(3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:
由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:
也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:
此时A实例的age值的变化是由test1方法引起的
(5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20
(6):运行第11行,根据此时的内存示意图,输出main方法中的age=20
5:对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
- public class TempTest {
- private void test1(A a){
- a = new A();//新加的一行
- a.age = 20;
- System.out.println("test1方法中的age="+a.age);
- }
- public static void main(String[] args) {
- TempTest t = new TempTest();
- A a = new A();
- a.age = 10;
- t.test1(a);
- System.out.println(”main方法中的age=”+a.age);
- }
- }
- class A{
- public int age = 0;
- }
运行结果为:
- test1方法中的age=20
- main方法中的age=10
为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下
6:再次理解按引用传递
(1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:
(2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:
(3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:
由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:
也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:
(5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:
注意:这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的。
(6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20
(7):运行第12行,根据此时的内存示意图,输出main方法中的age=10
7:说明
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
-
33.形参与实参?值传递与引用传递的区别?
2020-11-16 16:16:033、值传递与引用传递的区别 **值传递**: 真实的数据值---》改变副本**不影响原变量** 方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的事原始值的一个copy **引用传递**: 实参的引用地址被传递给...1、形参:方法定义的时候,声明的小括号内的参数
实参:方法调用的时候,实际传递给形参的数据或值。
2、Java参数传递的机制规则
参数 ---》基本数据类型---》实参真实存储的数据值
参数 ---》引用数据类型---》实参存储数据的地址值
3、值传递与引用传递的区别
**值传递**:
真实的数据值---》改变副本**不影响原变量**
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的事原始值的一个copy
**引用传递**:
实参的引用地址被传递给方法对应的形参,函数接收的事原始值的内存地址在方法执行中。---》**地址传递**----》对象地址---》所以对引用对象进行操作会**同时改变原对象**。
-
JS函数传参时:值传递与引用传递的区别
2020-03-26 21:11:00JS函数传参时:值传递与引用传递的区别 一、先分析基础数据与复杂数据的区别 : 基本数据类型:Undefined、Null、Boolean、Number、String 引用数据类型:对象 如:var a = 10; var b = a; b = 20; console.log(a); /...JS函数传参时:值传递与引用传递的区别
一、先分析基础数据与复杂数据的区别 :
基本数据类型:Undefined、Null、Boolean、Number、String
引用数据类型:对象
如:var a = 10;
var b = a;
b = 20;
console.log(a); //10
console.log(b); // 20JS函数传参时:值传递与引用传递的区别
对象是复杂类型:引用传递的数据
计算机的内存中分为两种区域:(计算机的仓库中)栈:存的是地址,目录
堆:存的是数据,后面的具体内容值传递的数据:不分地址和值,地址就是值,值就是地址,在目录上就介绍了所有内容,不用再向后翻页了
引用传递的数据:区分地址和值,地址是地址,值是值,找到地址后,需要根据地址说明的位置,才能找到值
数据的传递规则:拷贝规则,都是拷贝地址
因为值传递的数据,地址和值是一个内容,所以在拷贝之后,改变新的,不会影响老的
因为引用传递的数据,地址和值是两部分内容,所以在默认拷贝之后,仅仅拷贝了地址,没有拷贝值,此时两个地址指向了同一个值,那么就会造成修改新的,会影响老的,因为只有一个值,这种现象叫引用数据的浅拷贝
深拷贝,直接拷贝值
如:var arr1 = [1,2,3];
var arr2 = arr1; //浅拷贝
深拷贝:遍历拷贝
1.重新创建一个数组,表示一个新的地址,和老地址没有关系
var arr2 = [ ];
2.拿出老的地址中的所有的值,拷贝到新的地址中
for(var i=0;i<arr1.length;i++){
arr2.push(arr1[i]);
}
Console.log(arr2); //[1,2,3]二、函数的传参
函数的传参是要分两种情况—— 基本类型传参(值传参)和引用传参,传参可以理解为复制变量值。基本类型复制后俩个变量完全独立,之后任何一方改变都不会影响另一方;引用类型复制的是引用(即指针),之后的任何一方改变都会映射到另一方。1.基本类型的传参
function add(a) {
a += 10;
return a;
}var b = 20;
var r = add(b); //按值传参 a = b
alert(b); // 20, 没变化
alert( r); // 30
因为是按值传递的,传递完后俩个变量不相互影响!2.引用类型的传参
function setAge(obj) {
obj.age = 23;
}var p = new Object();
setAge ( p ); //因为是对象,按引用传参 obj = p
console.log(p.age); // 23
以上代码中创建一个对象,并将其保存在变量p中。然后,这个变量被传递到setAge(obj)函数中之后就被复制给了obj。在这个函数内部,obj和p引用的是同一个对象。换句话说,即使ECMAScript说这个变量时按值传递的,但obj也会按引用来访问同一个对象。于是,在函数内部为obj添加age属性后,函数外部的p也将有所反应;因为这时的p和obj指向同一个堆内存地址。 -
关于Java值传递与引用传递的区别
2018-02-28 16:26:14关于Java中形参与实参的理解今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别)。参考网站http://www.cnblogs.com/binyue/p/3862276.html。下面我将通过次博文... -
论JS函数传参时:值传递与引用传递的区别
2020-02-23 11:47:36JS函数传参时:值传递与引用传递的区别? 值传递:值传递的数据为基本数据类型,基本数据类型在内存中存放的是数值本身;值传递为单向传递,只能由实参传递给形参。 引用传递:引用传递的数据为复杂数据类型,复杂... -
论JS函数传参时:值传递与引用传递的区别
2020-02-21 21:48:50论JS函数传参时:值传递与引用传递的区别 JS中传参分为两种,一种是值传递,另一种引用传递,但其本质都是值传递。 值传递:值传递是单向传递,只由实参传给形参,而不能由形参传给实参。在内存中,实参与形参是不同... -
逆战-论JS函数传参时:值传递与引用传递的区别
2020-02-23 19:10:25@论JS函数传参时:值传递与引用传递的区别TOC 函数调用中,传递是一个数值,我们称为 “值传递”。 函数调用中,传递是对象,一般称为 “引用传递”。 这二者的本质区别就在于传递的数据类型不一样,值传递传递的是一... -
值传递与引用传递的区别:
2019-07-14 15:38:54今天重温Java基础的时候,看到了值传递与引用传递,对于初学者来说可能有点绕,我上网查阅很多资料: ...我找个一篇对值传递与引用传递的细致讲解博客: https://blog.csdn.net/a940659387/article/details/499... -
c++中 值传递与引用传递的区别
2019-08-19 17:22:37一、单变量的值传递与引用传递 1.值传递 调用时,将实参的值传递对应的形参,即为值传递。由于形参有自己独立的存储空间,又作为函数的局部变量使用,因此在函数中对任何形参值得修改都不会改变实参变... -
js传参值传递与引用传递的区别
2020-03-26 20:14:00值传递”是指:在函数中传递的是一个数值; “引用传递”是指: 在函数中传递的是一个对象。 二者本质区别就是传递的数据类型不一样, “值传递”传递的是一个值;“引用传递”传递的是一个对象。 JS函数参数传递... -
值传递与引用传递的区别及影响
2020-12-10 22:52:04值传递: (原变量,什么都不带) 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值...形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函.. -
值传递与引用传递的区别?
2017-02-25 12:25:12值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不影响实参的值引用传递: ... -
C++值传递与引用传递的区别
2020-08-14 21:48:04class person{ private: string name; public: person(string name):name(name){} string getName(){return this->name;... 显然,数值传递,在函数中只是一个副本,可以任意改变,但不会改变对象所在地址上的值。 -
论JS函数传递时,值传递与引用传递的区别
2020-03-02 21:23:04值传递: 传入函数的参数是外部定义的变量的数据的复制,将其复制后重新在内存中的新区域进行存放数据。与原外部定义变量的变化没有关系。一般用来传递JS中的基本数据类型。 JS中的基本数据类型有:string number ... -
论JS函数传参时:值传递与引用传递的区别。
2020-03-22 18:23:30本文主要讲述JS中函数传参时值传递与引用传递的区别。 首先我们可以这样理解: “值传递”是指:在函数中传递的是一个数值; “引用传递”是指: 在函数中传递的是一个对象。 可以看出二者本质区别就是传递的数据... -
C# 值传递与引用传递的区别
2015-12-22 11:54:02一、传递值类型参数 ...1、通过值传递值类型 当实参当作值来传递时,就产生的一个副本,也就是值不发生变化。 class MyTest { static void Main(string[] args) { int number=10; ModifyValue(number); -
论js函数传参时:值传递与引用传递的区别
2020-03-09 22:09:42引用传递的数据区分地址和值,找到地址后需要根据地址说明的情况才能找到相对应的值。 值传递的数据地址和值是同一个内容,因此在拷贝之后,改变新的数据之后不会对原来的数据产生影响; 而引用传递的数据地址和值...
-
虚幻4引擎基础
-
access应用的3个开发实例
-
Galera 高可用 MySQL 集群(PXC v5.6 + Ngin
-
在高密度软件定义的WiFi网络中实现负载平衡
-
Jenkins软件开发持续集成及自动构建
-
使用 Linux 平台充当 Router 路由器
-
Python启蒙到架构师的核心技术精讲课程
-
MySQL你该了解的那些事【服务端篇】
-
2012年上半年 信息系统管理工程师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
mpsoc zcu104 上做hdmi 显示实验
-
解决问题:这是解决问题的仓库-源码
-
2021 年该学的 CSS 框架 Tailwind CSS 实战视频
-
区块链应用开发实战(Go语言方向)
-
Unity ILRuntime框架设计
-
2018年下半年 信息系统监理师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
Unity 热更新技术-ILRuntime
-
异常色散光纤激光器中的线性耗散孤子
-
docker基本使用教程, 以及docker部署flask框架示例
-
使用内置传感器的LED进行LED热阻和TIM评估的研究
-
Kettle的使用——Excel输出