示意图

应用场景

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-对象引用和对象本身的更多相关文章

  1. Java对象引用和对象赋值

    关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用,那实在没法很好 ...

  2. Java 对象引用以及对象赋值

    一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle  :表示在堆空间内创建了一个Vehicle ...

  3. (转)浅谈Java中的对象和对象引用

    原文地址: http://www.cnblogs.com/dolphin0520/p/3592498.html 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很 ...

  4. JAVA 对象引用,以及对象赋值

    注:引自http://zwmf.iteye.com/blog/1738574 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里, ...

  5. JAVA 对象引用,以及对象赋值(转)

    原文链接:http://zwmf.iteye.com/blog/1738574 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里 ...

  6. 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值

    HashSet<String> refRegions = BE.get(regionName);    HashSet<String> values = new HashSet ...

  7. 浅谈Java中的对象和对象引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  8. java对象与java对象引用的区别

    java对象与java对象引用的区别 对象与对象引用的区别 直接用例子说话吧 Person per = new Person("张三"); 这一条语句,其实包括了四个动作: 右边的 ...

  9. 深度剖析Java变量栈&对象堆

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  10. 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

随机推荐

  1. python6.3类的继承与多态

    class Animal(object): def __init__(self,color): self.color=color def eat(self): print("动物在吃!&qu ...

  2. c++日志工具spdLog

    c++日志工具spdLog简单使用示例代码 spdlog直接引用头文件就可以使用,这一点还是比较方便的,也是刚入门使用,下面是在源码的示例代码基础上修改测试的代码: #include <cstd ...

  3. python分析BOSS直聘的某个招聘岗位数据

    前言 毕业找工作,在职人员换工作,离职人员找工作……不管什么人群,应聘求职,都需要先分析对应的招聘岗位,岗位需求是否和自己匹配,常见的招聘平台有:BOSS直聘.拉钩招聘.智联招聘等,我们通常的方法都是 ...

  4. Spring 中的反射与反射的原理

    作者:DeppWang.原文地址 在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本文来具体分析一下 Spring 中的反射 ...

  5. 【API进阶之路】高考要考口语?我用多模态评测API做了一场10w+刷屏活动

    摘要:闲着没事用多模态评测API做了一个测评英语口语的互动小游戏,居然成了一场10万人参与的刷屏级活动. 上一期故事说到,我成为了公司技术委员会副主席,上任后的第一件事是建立了一个云容器化的研发资料库 ...

  6. BLE MESH 学习[1] - ESP32 篇

    BLE MESH 学习 BLE MESH 是一种蓝牙(n:m)组网的技术. 本篇先介绍 BLE MESH 到使用 ESP32 的官方示例对其进行学习讲解. 后面会进一步学习 SIG 的 BLE MES ...

  7. Qt 信号发射部分 undefined reference to错误

    在使用信号与槽很容易发生 undefined reference to 发射信号  ①继承QObject ②添加Q_OBJECT ③执行qmake ④构建 然后就可以运行啦!但是不知道是为什么,悄咪咪 ...

  8. vue keep-alive 不生效和多级(三级以上)缓存失败

    vue keep-alive https://cn.vuejs.org/v2/api/#keep-alive keep-alive 不生效的可能原因 如果安装官方的写法,已经正常完成keep-aliv ...

  9. go语言gRPC系列(三) - 使用grpc-gateway同时提供HTTP和gRPC服务

    1. gRPC提供HTTP服务 1.1 存在的意义 1.2 代码示例 1.3 使用postman尝试调用 1.4 gRPC客户端代码调用 2. 使用grpc-gateway同时提供HTTP和gRPC服 ...

  10. SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码

    创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...