java对象值传递和对象传递的总结

Java千百问_05面向对象(011)_引用传递和值传递有什么区别 点击进入_更多_Java千百问1、什么是值传递值传递,是将内存空间中某个存储单元中存放的值,传送给另一个存储单元。(java中的存储单元并不是物理内存的地址,但具有相关性) 例如://定义了一个改变参数值的函数 public static void changeValue(int x) {   x = x *2; } public class TestMain{ //调用该函数 int num = 阅读详情

  前两天项目lead面试我,问的第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。
     先看基本类型作为参数传递的例子:
public class Test1 {
public static void main(String[] args) {
int n = 3;
System.out.println("Before change, n = " + n);
changeData(n);
System.out.println("After changeData(n), n = " + n);
}
public static void changeData(int nn) {
nn = 10;
}
}
我想这个例子大家都明白,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点:
Before change, n = 3
After changeData(n), n = 3
那么,我们现在来看看对象作为参数传递的例子,这也是大家争论的地方。
public class Test2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf.append("World!");
}
}




先看输出结果:
Before change, sb = Hello 
After changeData(n), sb = Hello World!




从结果来看,sb的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。从上面例子的输出结果来看,这样解释是合理。
现在我们对上面的例子稍加改动一下:
public class Test3 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf = new StringBuffer("Hi ");
strBuf.append("World!");
}
}
按照上面例子的经验:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。你会认为应该输出:
Before change, sb = Hello 
After changeData(n), sb = Hi World!




但运行一下这个程序,你会发现结果是这样的:
Before change, sb = Hello 
After changeData(n), sb = Hello




这就是让人迷惑的地方,对象作为参数传递时,同样是在方法内改变了对象的值,为什么有的是改变了原对象的值,而有的并没有改变原对象的值呢?这时候究竟是“传值”还是“传引用”呢?




下面就让我们仔细分析一下,来揭开这中间的奥秘吧。
先看Test2这个程序:
StringBuffer sb = new StringBuffer("Hello ");
这一句执行完后,就会在内存的堆里生成一个sb对象.sb是一个引用,里面存放的是一个地址“@3a”(这个“@3a”是我举的代表内存地址的例子,你只需知道是个内存地址就行了),而这个地址正是“Hello ”这个字符串在内存中的地址。




执行这一句后,就把sb传给了changeData方法中的StringBuffer strBuf,由于sb中存放的是地址,所以,strBuf中也将存放相同的地址,请看




此时,sb和strBuf中由于存放的内存地址相同,因此都指向了“Hello”。
strBuf.append("World!");




执行changeData方法中的这一句后,改变了strBuf指向的内存中的值,




所以,Test2 这个程序最后会输出:




After changeData(n), sb = Hello World!




再看看Test3这个程序。
没有执行到changeData方法的strBuf = new StringBuffer(“Hi “);之前,对象在内存中的图和上例中“图2”是一样的,而执行了strBuf = new StringBuffer(“Hi “);之后,则变成了:




此时,strBuf中存放的不再是指向“Hello”的地址,而是指向“Hi ”的地址“@3b” (同样“@3b”是个例子)了,new操作符操作成功后总会在内存中新开辟一块存储区域。
strBuf.append("World!");




而执行完这句后,




Hi World!
通过上图可以看到,由于sb和strBuf中存放地址不一样了,所以虽然strBuf指向的内存中的值改变了,但sb指向的内存中值并不会变,因此也就输出了下面的结果:
After changeData(n), sb = Hello
String类是个特殊的类,对它的一些操作符是重载的,如:
String str = “Hello”; 等价于String str = new String(“Hello”);
String str = “Hello”;
str = str + “ world!”;等价于str = new String((new StringBuffer(str)).append(“ world!”));
因此,你只要按上面的方法去分析,就会发现String对象和基本类型一样,一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。




综上所述,我们就会明白,在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。

OpenCL编译环境配置 在 Linux 系统上配置 OpenCL 开发环境需要安装适当的驱动、运行时和开发工具。 阅读详情

相关推荐

发那科FOCAS 1/2文档——核心库文件

在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。

snailiot的博客 1021

java的值传递问题

1.Java值传递介绍 java中有很多东西让人纠结了又纠结,总是想弄明白,但是总又那么模模糊糊,比如说java的值传递。也用了几年java了,这个东西只是知道java是值传递,从经验来说,基本类型传递过来了不会修改基本类型的值,但是引用类型传递过来之后却发现引用类型可以修改值,让人郁闷啊。 今天周日,闲着无聊看了下php,有个地方说$value是引用传递,要值传递的话必须用&value,纠结

q821424508的专栏 716

OpenCV轮廓匹配实战:5分钟搞定Hu矩形状识别(附完整代码)

本文详细介绍了使用OpenCV进行轮廓匹配的实战技术,重点讲解了Hu矩形状识别在工业质检等领域的应用。通过完整的代码示例和参数调优技巧,帮助开发者在5分钟内实现高效的形状识别,提升工业检测的准确性和效率。

nnn11的博客 675

Java中只存在值传递,调用函数赋值未修改异常

尽管在function()中对st对象进行了重新赋值,但是在main函数中的st对象并未修改。Java值传递

hahaha_2568的博客 1214

金现代面试题—— i++,++i, &&,&|自动装箱和自动拆箱(int,byte,float等)|取int等基本类型的最大值

public static void main(String[] args){ int i=1,j=1; if(i++==2&&++j==2){ i=7; } System.out.println(“i=”+i+”,j=”+j); } 请给出 输出结果:

老孟嘚吧嘚 1396

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 335

Java参数传递赋值不生效

如果是基本数据类型,那么可以直接声明属性(不赋值),进行参数传递。 如果是引用类型,则必须声明并赋值对象。也就是说需要new 出对象。

n_AloneT的博客 2649

【RT-DETR有效改进】手把手带你调参RT-DETR,1:1复现官方版本实验环境

本文是带大家进行调参,利用ultralytics仓库1:1复现RT-DETR官方实验环境,从而在后期发表论文 的时候省去一些不必要的麻烦,例如被审稿人提出质疑,本文的调参内容均有依据,根据RT-DETR官方Github上发布的版本进行设置本文的调参以ResNet18为例,其余的何其的调参基本一致。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR。

Snu77的博客 9928

Java中方法的传参问题----传值

创作缘由 方法的传参相信是每个程序员都必了解的问题,也是最基本的一个知识点。但是,学习编程近两年的我今天竟然跪在了Java的参数传递上。具体问题见下: 问题 在学习数据结构时,我写了一个数组的缩容的操作,即当数组数据量量减少一遍时,那么相应的数组的长度也减少一半。 我的想法很简单,当删除方法内元素时,进行一次数组内容量的判断,如果小于一半,则调用缩容的方法。缩容的方法进行了封装,以便于我之后复用。 我的代码: //删除数组的最后一个元素 public void removeLast() {

zhang19903848257的博客 1743

【25届数字IC秋招总结】面试经验15——比特大陆-算能

25届数字ic面试记录——比特大陆-算能

lalala0635的博客 554

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

JAVA引用传递导致的方法中重新赋值失败

在工作中遇到需要对某些参数进行业务逻辑过滤处理,在原方法中过滤成功。将业务过滤代码抽成公共方法后,过滤失败。当时情况如下: 原代码: public static void main(String[] args) { Boolean filter = true; List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.a

yiyeqingyang1998的博客 5174

2025.06.18【转录组】|Ribo-seq/small RNA数据分析:rRNA和smRNA比对率统计全流程

本文介绍了一种自动化统计rRNA/smRNA比对率的方法,用于评估Ribo-seq或small RNA测序数据的质量。主要内容包括:分析原理(比对率定义、参考序列来源)、实践流程(构建索引、比对统计)以及结果可视化方法。通过Python和R脚本实现自动化处理,可生成汇总表格和柱状图。比对率结果能反映样品污染程度,建议控制在20%以下。该流程有助于快速评估测序质量,为后续分析提供可靠依据。文中还提供了常见问题解决方案和脚本示例,适用于生物信息学标准化质控环节。

1616

java值对象和引用对象_java对象都是值传递,引用和值传递

java对象都是值传递,引用和值传递优亿在线152020-10-28招聘者爱问的一个基本难题:Java是值传递還是引用传递?想来大家都对这个问题都是有自身的观点,那究竟客观事实是如何的,大家又该怎样回应招聘者这个问题呢?今日我们就来好好地剖析一波值传递?引用传递?最先,大家得先了解什么是值传递,什么是引用传递,了解这一才可以了解Java究竟怎样做的。若要了解这二种传递必须先了解方式参数和具体参数2...

weixin_31002075的博客 265

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java对象和引用以及值传递

  更多请参考博客https://zwmf.iteye.com/blog/1738574 java对象和引用 java对象是java类的实例,通过两种方式创建,new和反射,对象存在于堆中 java引用可以理解为指向对象的遥控器,存在于栈中,同一个对象可以对应于多个引用 java的值传递 java的参数传递方式只有一种,那就是值传递,对于基本类型很容易理解,传入的是值的一个copy,对于...

dsfllx的博客 297

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java基础08(值传递和引用传递 类和对象)

是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数.

qq_52897007的博客 1804

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java 对象传值_java对象值传递和对象传递的总结

在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。传递基本类型时,传递的是副本的引用。前两天项目lead面试我,问的第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。先看基本类型作为参数传递的例子:public class Test1 {public static void main(String[] args) {int n = 3...

weixin_28865923的博客 686

Java面向对象-方法的值传递和引用传递

方法的值传递: 值传递 在方法里改变变量的值 作用范围仅仅是方法里 对外面不影响: 上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 packagecom.java.chap03.sec03; ...

weixin_41934292的博客 455

java 值传递和对象传递

第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。      先看基本类型作为参数传递的例子: public class Test1 { public static void main(String[] args) { int n = 3; System.out.println("Before change, n = " + n); changeD

Alexzhang369学习总结空间 572

java list值传递_Java中List<E>对象赋值问题(引用传递和值传递)

Java中List对象赋值操作问题业务需求是:取2个集合中的交集对象并返回。如下代码,busMap中key值和stocks中Map中的key值相等的对象则返回继续操作,也就是说剔除stocks中的不存在于busMap中的对象,就是一个过滤操作。实现代码 ① bug版报错:java.util.ConcurrentModificationException ; at java.util.Array...

weixin_32767301的博客 1402

Java对象管理、赋值语句和值传递的一些理解

Java关于赋值=的理解 首先明确,java中的赋值是把右边所管理的对象交给左边管理,也就是让左右两边去管理同一个对象(我觉得:把引用地址传递到了左边)。首先看一个例子: Hero hero1=new Hero("hero11"); Hero hero2; Hero hero3=new Hero("hero33"); hero2=hero1;//1 //hero1=new Hero("d"); hero1=hero3;//2 hero3=new Hero("dd");//3 System.out.print

bird-A 380

java对象的传递,Java对象值传递和对象传递的总结

再看看Test3这个程序。没有执行到changeData方法的strBuf = new StringBuffer(“Hi “);之前,对象在内存中的图和上例中“图2”是一样的,而执行了strBuf = new StringBuffer(“Hi “);之后,则变成了:此时,strBuf中存放的不再是指向“Hello”的地址,而是指向“Hi ”的地址“@3b” (同样“@3b”是个例子)了,new操作...

weixin_29292535的博客 216

java对象引用的理解和值传递

转:https://blog.youkuaiyun.com/miracle22222/article/details/85990554 这是一篇讲java引用和对象,以及值传递的文章,讲的很好还有思维导图 个人看完后总结一下 Student stu =new Student(); 这步可以分为两个步骤 Student stu; //引用的创建 ,创建在栈中的内存 stu=new Student(); /...

qq_41519442的博客 175

java类和对象数组传参_Java 从数组来看值传递和引用传递

从数组来看值传递和引用传递惯例先看一段代码public class DemoCollection14 {public static void main(String[] args) {String [] strs = {"zs", "ls", "wu"};for (String str : strs) {strs[0] = null;System.out.println(str);}for (St...

weixin_39631017的博客 191

Java类与对象的创建调用,值传递和引用传递

类与对象的创建调用 先看一下类与对象的关系,搞清楚概念 创建一个Student类 package com.zsw.oop.demo02; public class Student { //属性:字段 String name;//null int age;//0 //方法 public void study(){ System.out.println(this.name+"在学习");//this代表当前这个类 } } 创建Applica

zzhangsiwei的博客 336

Java 值传递和对象传递详解

1、需要明白的概念: 堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。传递原理: 一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是对对象引用地址值的拷贝,而非具体值拷贝。下面分析三种情况:①一个方法不能改变传入基本类型的参数值。 示例代码:public class Test2 { public static void ma

冯海林的专栏 8767
上一篇: struts1的总结
下一篇: 设计模式之观察者模式(二)
beyond667
博客等级 码龄15年 41粉丝 30原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值