java-对象引用和对象本身
示意图
应用场景
1.赋值
只有用新的对象本身直接赋值给对应引用,该对象引用的值会改变,因为对象引用指向的对象本身改变了。
2.方法入参
调用方法和被调用方法。
代码
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author gzh
* @createTime 2020/8/25 8:41 AM
*/
public class Test {
private static final Logger log = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
//
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setName("gzh1");
userList.add(user1);
User user2 = new User();
user2.setName("gzh2");
userList.add(user2);
log.info(JSONObject.toJSONString(userList));
//
// for (User user: userList) { //这里的list元素最终是旧值,因为没有被新的对象本身直接赋值
// log.info(JSONObject.toJSONString(user));
// User user3 = new User();
// user3.setName("gzh3");
//
// user = user3;
// log.info(JSONObject.toJSONString(user));
// }
// for (int i = 0; i < userList.size(); i++) { //这里的list元素最终是新值,因为被新的对象本身直接赋值
// //
// User user = userList.get(i);
//
// //
// log.info(JSONObject.toJSONString(user));
// User user3 = new User();
// user3.setName("gzh3");
// user = user3;
//
// //
// log.info(JSONObject.toJSONString(user));
// userList.set(i,user);
// }
for (int i = 0; i < userList.size(); i++) { //同上:这里的list元素最终是新值,因为被新的对象本身直接赋值
//
log.info(JSONObject.toJSONString(userList.get(i)));
//
User user3 = new User();
user3.setName("gzh3");
//
userList.set(i,user3);
log.info(JSONObject.toJSONString(userList.get(i)));
}
//
log.info(JSONObject.toJSONString(userList));
}
}
执行结果
19:49:39.062 [main] INFO Test - [{"name":"gzh1"},{"name":"gzh2"}]
19:49:39.064 [main] INFO Test - {"name":"gzh1"}
19:49:39.065 [main] INFO Test - {"name":"gzh3"} //因为list的元素被新的对象本身直接赋值,所以值改变了
19:49:39.065 [main] INFO Test - {"name":"gzh2"}
19:49:39.065 [main] INFO Test - {"name":"gzh3"} //同上
19:49:39.065 [main] INFO Test - [{"name":"gzh3"},{"name":"gzh3"}] //同上
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author gzh
* @createTime 2020/8/25 8:41 AM
*/
public class Test2 {
private static final Logger log = LoggerFactory.getLogger(Test2.class);
public static void main(String[] args) {
User user = new User();
user.setName("gzh1");
log.info("调用方法之前:{}",JSONObject.toJSONString(user));
updateUser2(user);
log.info("调用方法之后:{}",JSONObject.toJSONString(user));
}
private static void updateUser(User user) {
//
log.info(JSONObject.toJSONString(user));
//
User user2 = new User();
user2.setName("gzh2");
user = user2;
//
log.info(JSONObject.toJSONString(user));
}
private static void updateUser2(User user) {
//
log.info(JSONObject.toJSONString(user));
user.setName("gzh2");
//
log.info(JSONObject.toJSONString(user));
}
}
运行结果
19:50:35.072 [main] INFO Test2 - 调用方法之前:{"name":"gzh1"}
19:50:35.077 [main] INFO Test2 - {"name":"gzh1"}
19:50:35.077 [main] INFO Test2 - {"name":"gzh2"}
19:50:35.077 [main] INFO Test2 - 调用方法之后:{"name":"gzh2"} //因为入参仍然指向同一个对象本身,并没有被新的对象本身重新赋值,所以入参的值(即对象本身)改变之后,入参的原始对象引用的值(即对象本身)也改变了。
总结
1.不同的对象引用,存放在不同的内存地址,而该内存地址存储的值又是对象本身的内存地址,对象引用正是通过对象本身的内存地址指向对象本身。
2.对象引用的值(即指向的对象本身)什么时候会被改变?什么时候不会被改变?
只有直接赋值了新的对象本身,对应引用的值才会改变。
不同的对象引用没有关系,1)如果被同一个对象本身赋值,那么两个对象引用都指向同一个对象本身,除此之外,就没有其他的关系,不同的对象引用是互相独立的,且他们之间没有任何关系2)如果一个对象引用被新的对象本身赋值,另一个对象引用仍然是指向旧的对象本身,所以再次证明两个对象引用之间是没有任何关系的,两个对象本身之间也是没有任何关系的。
3.如果改的是同一个对象本身,那么对象引用1和对象引用2的值同时改变。
4.如果对象引用2是指向了新的对象,那么对象引用2的值改变,对象引用1的值不变。
最佳实践
1.如果想要改变引用的值,应该直接赋值,而不是间接通过其他对象引用来改变。
2.如果是调用方法修改,应该通过返回值修改,而不是通过对象引用。
java-对象引用和对象本身的更多相关文章
- Java对象引用和对象赋值
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用,那实在没法很好 ...
- Java 对象引用以及对象赋值
一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle :表示在堆空间内创建了一个Vehicle ...
- (转)浅谈Java中的对象和对象引用
原文地址: http://www.cnblogs.com/dolphin0520/p/3592498.html 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很 ...
- JAVA 对象引用,以及对象赋值
注:引自http://zwmf.iteye.com/blog/1738574 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里, ...
- JAVA 对象引用,以及对象赋值(转)
原文链接:http://zwmf.iteye.com/blog/1738574 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里 ...
- 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
HashSet<String> refRegions = BE.get(regionName); HashSet<String> values = new HashSet ...
- 浅谈Java中的对象和对象引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- java对象与java对象引用的区别
java对象与java对象引用的区别 对象与对象引用的区别 直接用例子说话吧 Person per = new Person("张三"); 这一条语句,其实包括了四个动作: 右边的 ...
- 深度剖析Java变量栈&对象堆
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
随机推荐
- 嵌入式Linux串口编程简介
文章目录 简介 用到的API函数 代码 简介 嵌入式Linux下串口编程与Linux系统下的编程没有什么区别,系统API都是一样的.嵌入式设备中串口编程是很常用的,比如会对接一些传感器模块,这些模块大 ...
- 从零搭建Spring Boot脚手架(1):开篇以及技术选型
1. 前言 目前Spring Boot已经成为主流的Java Web开发框架,熟练掌握Spring Boot并能够根据业务来定制Spring Boot成为一个Java开发者的必备技巧,但是总是零零碎碎 ...
- 一文说通C#中的异步编程补遗
前文写了关于C#中的异步编程.后台有无数人在讨论,很多人把异步和多线程混了. 文章在这儿:一文说通C#中的异步编程 所以,本文从体系的角度,再写一下这个异步编程. 一.C#中的异步编程演变 1. ...
- 牛逼!Python的判断、循环和各种表达式(长文系列第2篇
流程控制是python语法很重要的一个分支,主要包括我们经常用到的判断语句.循环语句以及各种表达式,这也是上一篇文章没有介绍表达式的原因,在这篇文章中会更加系统全面的讲解这三方面的基础知识. 很多人学 ...
- 100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语 ...
- WebApi的创建,部署,Oauth身份认证(一)
1.首先创建一个项目 2.选择Web API 3.创建一个空的控制器 4.控制器名称为MyApiController using System; using System.Collections.Ge ...
- 面试官:怎么做JDK8的垃圾收集器的调优?
面试官:怎么做JDK8的垃圾收集器的调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在JDK8中有Serial收 ...
- Hexo博客中插入 Chart 动态图表
该文基本(全部)来自于chatjs中文文档 由于使用pjax,导致页面需要二次刷新才会显示表格,故引入了自动刷新的JS,但这样会导致回退标签失效 背景 今天在谷歌上逛博客时,突然发现shen-yu大佬 ...
- Linux内核之 进程管理
正如上一篇我们提到过,进程是Linux系统中仅次于文件的基本抽象概念.正在运行的进程不仅仅是二进制代码,而是数据.资源.状态和虚拟的计算机组成.我们今天主要介绍进程的概念,组成,运行状态和生命周期等. ...
- Java引用类型之弱引用与幻像引用
这一篇将介绍弱引用和幻像引用. 1.WeakReference WeakReference也就是弱引用,弱引用和软引用类似,它是用来描述"非必须"的对象的,它的强度比软引用要更弱一 ...