理解--->Java中的值传递&引用传递
转自:http://url.cn/5tL9F5D
值传递和引用传递
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数,形参和实参总是指向同一个地址,形参指向哪里实参就会指向哪里。
java中的基本数据类型和引用数据类型
java中的基本数据类型:
4种整数类型:byte、short、int、long
2种浮点数类型:float、double
1种字符类型:char
1种布尔类型:boolean
java中的引用数据类型:
类
接口
数组
下面就对JAVA中传递参数是值传递还是引用传递展开讨论
下面先来看基本数据类型
下面先来看基本数据类型
public class Test {
static void testInt(int a, int b)
{
a=10;
b=20;
System。out。println("交换后 "+"a:"+a+", b:"+b);
}
public static void main(String[] args)
{
int a=1;
int b=2;
System。out。println("交换前 "+"a:"+a+", b:"+b);
testInt(a,b);
System。out。println("方法结束后"+"a:"+a+", b:"+b);
}
}
运行结果是这样的:
交换前:1 2
交换后:10 20
res : 1 2
java中基本数据类型在传递的时候,用的是值传递,就是拷贝和实参一模一样的值然后由形参进行操作,当方法结束后,形参的生命周期就会终止,实参的值并没有受到影响。
下面来看引用数据类型
// 类的编写
class Car
{
public String name;
public Car()
{}
public Car(String name)
{
this。name=name;
}
}
下面进行测试 public class Test
{
public static void update1(Car car)
{
car。name="GTR";
System。out。println("修改后的名字是:"+car。name);
}
//这个方法比上面的方法多了一条a=new Car()语句
public static void update2(Car car)
{
car=new Car();
car。name="GTR";
System。out。println("修改后的名字是:"+car。name);
}
public static void main(String[] args)
{
Car a=new Car("AE86");
Car b=new Car("AE86");
System。out。println("调用update1前a的名字是:"+a。name);
update1(a);
System。out。println("调用update1后a的名字是:"+a。name);
System。out。println("调用update2前b的名字是:"+b。name);
update2(b);
System。out。println("调用update2后b的名字是:"+b。name); }
}
结果:
AE86
GTR
GTR
AE86
GTR
AE86
看完上面的update1方法,觉得引用数据类型和基本数据类型不一样,引用数据类型传入方法后,方法调用结束后对象的属性发生了变化,认为这是引用传递,将对象a的地址送到了形参中,然后对形参改变实参就会改变。
但是update2马上就推翻了这个想法,将实参送入形参后,形参马上在堆中新建了一个对象,如果是引用传递,那么此时形参和实参都是指向这个对象的,然后程序又对形参的name属性进行了修改,那么此时实参也会被修改,看到的结果就应该和update1一样。但是结果却不是这样的,并没有修改数据,这就说明了将对象作为实参传入方法的形参,并不是引用传递。
那么java中引用类型数据到底是怎么回事那,下面把自己的查阅资料理解的写下来。作为后续回顾。
Car b = new Car(“AE86”);
执行这个语句首先会在栈中创建一个b变量,然后在堆中创建一个Car类的实例,然后b指向堆中的实例。
其实在java程序中,将对象传入形参中,也是值传递,基本数据类型值传递就是拷贝一个变量的副本;下面以update2()分析,引用数据类型就是将变量名(b)指向堆的地址复制一份,也就是说在栈中有一个变量名(car)也指向堆中b的实例。
现在执行 car =new car();就是形参car指向了堆中一个新的地址,而b还是指向原来的地址的,这样的话,car随便修改name属性,是影响不到b的。最后方法结束car被释放,堆中的新对象被GC回收。
在update1()中可以修改是因为形参和实参指向同一块内容,当形参修改name属性,那么堆中的对象就会被修改,update1()执行结束后,car释放,但堆中的实例还有变量指向,不会被回收,这时就修改了b的值。
理解--->Java中的值传递&引用传递的更多相关文章
- 如何形象简单地理解java中只有值传递,而没有引用传递?
首先,java中只有值传递,没有引用传递.可以说是"传递的引用(地址)",而不能说是"按引用传递". 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原 ...
- 理解java中的值传递与“引用传递”
额....java中其实没有引用传递 对于引用类型 ,在调用方法后,直接拷贝了引用的副本,但是它们指向了相同的堆地址,所以看起来像引用传递,但其实是值传递,只不过传递的引用的副本. 说一说为什么Str ...
- 在Java中字符串是通过引用传递的?
这是一个经典的java问题.在stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误的或不完整的. 如果你不想深入思考的话,这个问题很简单.如果你想明白的更彻底,那么问题可能容易 ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- (转载)理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...
- Java中的值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...
- Java中的值传递和地址传递(传值、传引用)
首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...
- java中的值传递和引用传递区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- (转)Java中的值传递和引用传递
Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值 ...
随机推荐
- linux 安装 DenyHosts 防止密码被暴力破解
DenyHosts DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件 ...
- Blazor
https://docs.microsoft.com/zh-cn/windows/uwp/get-started/construct-form-learning-track https://docs. ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- maven配置checkstyle插件对代码规范进行静态检查
checkstyle配置的官方网站:http://checkstyle.sourceforge.net/config.html (1)新建maven项目,配置checkstyle插件 pom.xml ...
- win8 下面 listen 的队列长度貌似无效了 上c/s 代码 并附截图,有图有真相
#include <WinSock2.h> #include <stdio.h> #include <windows.h> DWORD ServerRoutine( ...
- 循环神经网络-RNN入门
首先学习RNN需要一定的基础,即熟悉普通的前馈神经网络,特别是BP神经网络,最好能够手推. 所谓前馈,并不是说信号不能反向传递,而是网络在拓扑结构上不存在回路和环路. 而RNN最大的不同就是存在环路. ...
- poj1062(分区间迪杰斯特拉,内含测试数据,一直wa的同学可以进来看看)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54946 Accepted: 16518 Descripti ...
- 互评Final版本
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2478] 基于NABCD评论作品,及改进建议 杨老师粉丝群.作品:<Pin ...
- <HBase><Scan>
Overview The Scan operation for HBase. Scan API All operations are identical to Get with the excepti ...
- PHPexcel 导入import 数据到 mysql: mysql 查询数据是否存在, 如果存在返回id, 不存在, 插入返回id. 2) mysql_query , mysql_connect, mysql_select_db, mysql_error, mysql_num_rows,mysql_close
一: 要求: 上面的图表 中的数据插入到 3张表中. 1)t_vide_warehourse 分类表: 此表中包含 一级分类 和二级分类. 二级分类是一级分类的子级. 2)t_video_info ...