java的值传递

先看以下代码:
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {

Person person = new Person();//---1
Person p2 = new Person();
person.setAge(12);
person.setName("lj");
test.changePerson(person,p2);//---2 该处person不同于1处的person,而是前者的一个拷贝,他们指向堆中同一个对象
System.out.println("in main...");
System.out.println("person.age:" + person.getAge());
System.out.println("person.name:" + person.getName());
}
void changePerson(Person p1,Person p2){
p2.setAge(13);
p2.setName("yb");
p1 = p2;
System.out.println("in changePerson...");
System.out.println("person.age:" + p1.getAge());
System.out.println("person.name:" + p1.getName());
}
}

运行结果:
in changePerson...
person.age:13
person.name:yb
in main...
person.age:12
person.name:lj
也许会很奇怪,java对象在方法里传递时不是引用传递么?为什么传过去的person在changePerson()方法体内把引用指向了p2,但回到主方法后又把引用指向了原来的对象
原因如下:

主函数中: person--> [age:12 name:lj] <--person’

person'即为test.changePerson(person,p2); 中的person,它与前面的person具有相同的引用地址,因此java中的“对象变量”的传递叫做“引用传递”。但就其实质而言,还是值传递,只不过这个值是引用(或者说地址)而已。

changePerson函数中:person对象的拷贝p1又把引用指向了另一个对象p2,所以会打印出新对象的信息,而当这个函数结束,p1的生命周期也就结束了。
再次回到主函数时,person对象指向原来的对象的事实没有改变,所以还是打印出原来对象的信息

如果还有一个函数changePerson2如下:
void changePerson2(Person p){
p.setAge(100);
p.setName("ljyb");
}

则在主函数增加如下代码:
test.changePerson2(person);
System.out.println("in changePerson...");
System.out.println("person.age:" + person.getAge());
System.out.println("person.name:" + person.getName());
结果为:
after invoking changePerson2...
person.age:100
person.name:ljyb

此时的传递方式与上面相同,changePerson2中的p变量也是主函数中person变量的一份拷贝,他们指向同一个对象。p改变了这个对象的值,也就改变了person指向对象的值。
当changePerson2函数结束时,p的生命周期也结束了,但它在changePerson2内做的操作却被保存下来了。
此时打印person的信息就变成修改后的信息了。

我还找到一些相关资料,附下
下面的文字来自一个哥们的文章中的评论,他写的这篇文章也是关于java值传递的
网址:http://zangweiren.iteye.com/blog/214369

有些争论没有意义,其实你知道传值和传引用由什么区别就可以了,但不要自以为是的认为就是别人混淆了。
“有一种说法是当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。这种说法显然是混淆了值和引用的概念。”
我看到的很多书中都是只有pass by value的概念。
James Gosling,我想他对Java语言里的一些概念还是有话语权的,《The Java Programming Language》2.6.5. Parameter Values一节中,他的说法是 :
[quote]All parameters to methods are passed "by value." In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments.。。。。。You should note that when the parameter is an object reference, it is the object reference not the object itself that is passed "by value." Thus, you can change which object a parameter refers to inside the method without affecting the reference that was passed. But if you change any fields of the object or invoke methods that change the object's state, the object is changed for every part of the program that holds a reference to it. [/quote]这里说的很清楚了,方法的所有参数都是值传递。

别的书里也有提及 ,Core Java 卷一中也有类似的说法,举了一些例子。
Thinking In Java中也提到过,具体什么地方记不清楚了。
从编译原理的概念来说,有传值,传地址,传名,传结果等。这里的传地址明显和java的传引用不一样。C++中引入了传引用,但是C++的传引用有个明显的特点,引用一旦创建不能修改,所以引用不能指向新的对象。所以不会出现java这种令人混淆的概念。所以还是多用Java中的术语,区分pass by value中不同的情况,而不是自己引入pass by reference 的概念让人们更加混淆。
Java是值传递还是引用传递 形参即每个函数或者方法上的声明的占位符变量,如下代码整型的value实参:调用函数或方法时传的参数,如下代码就的func这个概念在c++c#中才有,简单来说就是将实参所指向的变量。 阅读详情

相关推荐

Java 值传递详解

很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。引用传递看似很好,能在方法内就直接把实参的值修改了,但是,为什么 Java 不引入引用传递呢?为了更强有力地反驳 Java 对引用类型的参数采用的不是引用传递,我们再来看下面这个案例!实际上,并不是的,这里传递的还是值,不过,这个值是实参的地址罢了!的副本,副本的内容无论怎么修改,都不会影响到原件本身。的互换只是拷贝的两个地址的互换罢了,并不会影响到实参。(实参)的地址,因此,它和。

些许风霜罢了 1062

java 去重函数_去重函数unique,sort,erase的应用

std::unique一.总述unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复出现的元素依次排在后面二....

weixin_34508986的博客 2580

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 403

unique()函数详解

unique():返回参数数组中所有不同的值,并按照从小到大排序 可选参数: return_index=True: 返回新列表中的每个元素在原列表中第一次出现的索引值,因此元素个数与新列表中元素个数一样 return_inverse=True:返回原列表中的每个元素在新列表中出现的索引值,因此元素个数与原列表中元素个数一样   一、元素为数值型数据 #一、元素为数值型数据 impo...

大胡子的博客 7万+

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 442

从零到一:Cadence AC仿真中的运放性能参数深度解析与实战避坑指南

本文深度解析Cadence AC仿真中运放性能参数的精确测量方法,包括开环增益、带宽和相位裕度等关键指标。通过实战案例分享常见设置错误的避坑技巧,帮助工程师提升设计成功率和仿真效率,特别针对全差分运放和工艺角分析提供专业指导。

www00的博客 294

Java异常(违例)与捕获

异常与捕获异常的分类异常的处理格式throws关键字throw关键字throws和throw区别Exception与RuntimeException的区别java中几个常见的异常 异常的分类 几乎所有的代码都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要异常处理。 在java程序设计语言中,异常对象都是派生于Throwable类的一个实例 下图是java异常层次结构...

_Unique_ 1016

[UE5蓝图基础二]1.[1d混合空间] 走和跑的动画切换(shift切换)

再双击”run”进去 我们需要给他指定一个动画姿势,这里就需要给他我们前面做的”1d”混合空间,然后可以看到”1d” 上有个speed参数,代表的速度 从前面的逻辑来看需要通过控制速度来切换动画,那么必然不能写死速度,把速度提升为变量传递进来即可,所以就得到以下蓝图节点。混合空间的概念:混合空间就是可以将角色多个动画混合在一起 ,我们创建动画类就是创建个”Animation”文件夹 在文件夹内创建混合空间。我们目前要实现的是一个走和跑的功能 那么创建1d即可。到这一步混合空间已经做完 下一步做”动画蓝图”

qq_30584617的博客 3299

unique函数的使用

unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。 // sort words alphabetically so we can find the duplicates sort(words.b

Change_ZHONG 1795

Agent应用实践之二十九 - 设计模式:人机协同

本章讲解了一种比较常见的设计模式:人机协同。通过一些场景举例,同时使用AgentScope本身自带的能力实现的人机协同模式,最后通过源码分析了AgentScope中如何实现。通过了解人机协同模式对于实际工程使用也是非常有用的。

代码让AI扣 305

vue2/3 - H5 移动端网页中调用手机摄像头扫描二维码 / 条形码功能,在h5手机网页里调起相机摄像头进行二维码或条形码扫描效果详细教程(详细示例组件源码,一键复制开箱即用!)

vue扫描二维码条形码,vue网页调用摄像头扫二维码条形码,vue移动端如何实现调用相机扫描二维码,vue移动端扫一扫功能,vue怎么做移动端h5扫一扫功能,vue识别二维码和条形码,vue实现点击按钮调用摄像头扫码,vue调用本地摄像头实现拍照功能,Vue中如何进行二维码生成与扫描,如何实现vue在手机浏览器中调用摄像头实现扫描二维码功能,VUE项目移动端H5调用摄像头扫码,vue项目中实现H5调取摄像头,网页调用摄像头实现二维码扫描功能,vue调用手机摄像头,vue在调用摄像头扫码,vue自定义打开摄像

✅ 精选推荐文章 1万+

java mysql 唯一约束_数据库中创建unique唯一约束

最近项目中的需求,确定唯一一条数据,原来貌似碰到过,忘记了,现在记录一下。实现唯一约束还可以不是主键的unique。oracle中的unique约束是用来保证表中的某一类,或者表中的某一类组合起来不重复的一种手段。我们在可以在创建表时或者创建好后通过修改表的方式来创建oracle中的unique约束。下面是一些创建unique约束的例子:create table unique_test(id nu...

weixin_35873946的博客 556

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

Java 值传递

在 swap()方法中,a、b的值进行交换,并不会影响到num1 、num2。因为,a、b的值,只是从num1、num2的复制过来的。也就是说,a、b相当于num1、num2的副本,副本的内容无论怎么修改都不会影响到原件本身。因此,person1和person2的互换只是拷贝的两个地址的互换罢了,并不会影响到实参xiaoZhang和xiaoLi。也就是说change方法的超参数拷贝的是arr(实参)的地址,因此,它和arr指向的是同一个数组对象。这里的传递的还是值,不过,这个值是实参的地址罢了。

rc1596919047的博客 873

实战案例—encrypt靶场(AES固定key篇)

AES是一种对称密钥加密方法,意味着加密和解密时使用相同的密钥。AES加密存在三种形式:AES-128、AES-192和AES-256,它们分别对应于三种不同的密钥长度——128位(即16字节)、192位(即24字节)和256位(即32字节)。通常情况下,密钥的长度越长,提供的安全性就越高,但相应地,加解密过程所需的时间也会增加。默认情况下,采用的是AES-128,其提供的安全性对于大多数应用来说已经足够充分。

zhouzhou_98的博客 498

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java值传递与引用传递的区别

Java值传递与引用传递 文章目录Java值传递与引用传递前景实参与形参值传递与引用传递Java中的值传递总结 前景 关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么。 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。 错误

qq_47897078的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java的值传递

一、值传递和引用传递 在程序设计语言中将参数传给方法或函数的方式目前有两种:一种是值传递,一种是引用传递。 值传递表示将实参的值传递给方法;引用传递表将实参a的地址引用传递给方法。 Java是采用值传递的,Java程序中的方法得到的总是实参值的拷贝, 二、代码运行 我们来看下下面代码的运行结果 public class Main { public static void main(String[] args) { ...

HerryBody 4549

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java中的值传递

本文探讨Java的参数传递机制,指出Java仅支持值传递而非引用传递。值传递是指传递参数值的副本,不影响原始数据;而引用传递则传递变量的地址,会直接影响原对象。通过多个代码示例(如基本类型交换、数组修改、对象引用变更等)演示了值传递的实际表现,并解释即使对象引用也是按值传递副本。文章最后从语言设计角度分析Java选择值传递的原因:简化模型、提高可读性、增强安全性,同时说明通过包装类等方式仍能实现类似引用传递的效果。这种设计使Java更安全可控,避免了引用传递的潜在副作用。

m0_74871188的博客 695

Java中是值传递和引用传递

值传递 / 引用传递 值传递:就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来的实参。 引用传递:是在方法调用的时候,实参将自己的地址传递给形参,此时方法内对该参数值的改变,就是对该实参的实际操作。 Java中只有值传递 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。 按值调用(call by value):表示方法接收的是调用者提供的值。 按引用调用(call by reference):表示方法接收的是调用者提供的变量地址。

qq_52467117的博客 4982

java中按值传递_Java中为什么只有按值传递

Java中为什么只有按值传递Java 中只有按值传递"Java 中只有按值传递",初看到这几个字有点不敢相信,无数次通过函数改变过对象,无数次跟同事说 Java 在传对象的时候是按引用传递。后来细细想想,之所以以为 Java 传对象是按引用传递是因为其中有很多概念都没理清楚,与 C++ 中的搞混了。从 C++ 转 Java 的时候将 C++ 中的知识点映射到 Java 没错,这有利于 C++ 转 ...

weixin_39581945的博客 211

为什么Java中只有值传递?

要弄清这个问题,先得了解两个概念:形参&实参值传递&引用传递。

m0_73804764的博客 1230
上一篇: final,finally,finalize方法
下一篇: 关于java中的string
unique5945
博客等级 码龄20年 4粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值