Java面试 - 复制引用和复制对象的区别?
复制引用:把原对象的地址赋给了一个新的引用变量,只要其中一个对象的属性发生变化,另一个对象的属性也随之发生变化。
复制对象:把原对象的内容赋给了一个新的对象,其中一个对象的属性发生变化,并不影响另一个对象的属性。
举例:被复制对象为Student s1,复制的新对象为Student s2
复制引用:
Student s1 = new Student("Jack");
//把对象s1赋给对象s2
Student s2 = s1;
System.out.println("对象s1的引用地址:" + s1);
System.out.println("对象s2的引用地址:" + s2);
打印结果
对象s1的引用地址:Student@1c20c684
对象s2的引用地址:Student@1c20c684
可以看出,打印的地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。说明复制引用是把原对象的地址赋给了一个新的引用变量。对象s1和 对象s2 只是引用而已,他们都指向了一个相同的对象 Student("Jack")。
如果修改对象s2的属性name, 那么对象s1的属性name是否同样会被修改呢?
Student s1 = new Student("Jack");
Student s2 = s1;
//修改对象s2的属性name
s2.setName("Jack Ma");
System.out.println("对象s2 的name属性:" + s2.name);
System.out.println("对象s1 的name属性:" + s1.name);
打印结果
对象s2 的name属性:Jack Ma
对象s1 的name属性:Jack Ma
此时对象s1 的属性name也被修改为Jack Ma。由此可知,复制引用时,只要其中一个对象的属性发生变化,另一个对象的属性也随之发生变化。
复制对象
Student s1 = new Student("Jack Ma");
Student s2 = new Student();
//将对象s1的name 赋给对象s2
s2.setName(s1.name);
System.out.println("对象s1的引用地址:" + s1);
System.out.println("对象s2的引用地址:" + s2);
打印结果
对象s1的引用地址:Student@1c20c684
对象s2的引用地址:Student@1fb3ebeb
可以看出,打印的地址值是不同的,既然地址都是不相同的,那么肯定是不同的对象。说明复制对象是把原对象的内容赋给了一个新的对象。
如果修改对象s2的属性name, 那么对象s1的属性name是否同样会被修改呢?
Student s1 = new Student("Jack Ma");
Student s2 = new Student();
s2.setName(s1.name);
//修改对象s2的属性name
s2.setName("Jack");
System.out.println("对象s2的属性name:" + s2.getName());
System.out.println("对象s1的属性name:" + s1.name);
打印结果
对象s2的属性name:Jack
对象s1的属性name:Jack Ma
修改对象s2的属性name后,对象s1的属性name并没有被修改为Jack。由此可知,复制对象时,其中一个对象的属性发生变化,并不影响另一个对象的属性。
Java面试 - 复制引用和复制对象的区别?的更多相关文章
- Java多态 父类引用指向子类对象
Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father c = new Child() 在c的 ...
- 22.Java面试学习平台-整合OSS对象存储
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- java面试-强引用、软引用、弱引用和幻象引用有什么区别
在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响. 1 .强 ...
- java两个引用指向同一个对象
- Java面试——String、StringBuider以及StringBuffer的区别和使用场景
1. String.StringBuider.StringBuffer的区别 String是不可变的对象,因此在每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指 ...
- Java面试 - final、finally、finalize的区别?
final:用于声明属性, 方法和类,分别表示属性不可变.方法不可覆盖.被其修饰的类不可继承. finally:异常处理语句结构的一部分,表示总是执行. finalize:Object 类的一个方法, ...
- java实现面向对象和javaScript基于对象的区别&java垃圾回收机制和其他编程语言的比较
java javaScript javaGC和C语言内存分配和内存释放
- Java 有状态和无状态对象的区别
无状态会话Bean 无状态就是对于一次操作,不能保存数据.无状态对象(Stateless Bean)是没有实例变量的对象,不能保存数据,是不变类,是线程安全的.例如: public class ...
- Java面试 - 重载(Overload)和重写(Override)的区别?
1.重载是在同一个类中,可声明多个同名方法,但参数列表不同(参数顺序,个数,类型).而重写是在子类中,对从父类中继承的方法进行重新编写,但方法名,参数列表(参数顺序,个数,类型),返回值类型必须保持一 ...
随机推荐
- AtCoder Grand Contest 004题解
传送门 \(A\) 咕咕 int a,b,c; int main(){ scanf("%d%d%d",&a,&b,&c); if((a&1^1)|( ...
- P2258 子矩阵——搜索+dp
P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点: 我们只需要优化一下第二个二进制枚举的部分: 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右: sum_shang,sum_hen ...
- pycharm通过pytest运行报错:No test were found 解决
今天写代码犯了一个不应该犯的小错误,通过记录下来便于查看 1.报错代码如下: platform win32 -- Python 3.7.3, pytest-4.0.2, py-1.8.0, plugg ...
- Iptables 之二扩展模块 nat
问题一:如果开发被动模式的ftp服务? 21号端口是命令连接端口,数据连接端口不固定 三步骤: (1)装载ftp追踪时的专用的模块 /lib/modules/$(uname-r)/kernel/ker ...
- Vue.js中 watch的理解以及深度监听
如代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=" ...
- Kafka(二) —— Server端设计原理
整理架构 kafka confluence kafka官方文档中文翻译-设计 消息设计 /** * 消息类 * * @author Michael Fang * @since 2019-11-14 * ...
- BeanDefinitionParserDelegate与资源解析
继续上一次的分析 XmlBeanDefinitionReader.java 中 1.registerBeanDefinitions方法 documentReader.registerBeanDefin ...
- Java hashCode与equals学习
1.关于Object类的equals方法的特点 a) 自反性: x.equals(x) 应该返回true b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true c ...
- GCN: Graph Convolutional Network
从CNN到GCN的联系与区别: https://www.zhihu.com/question/54504471/answer/332657604 更加详解Laplacian矩阵: https://ww ...
- GB28181技术基础之2 - H264与PS封包
二. PS封包 PS 是 GB28181 规定的标准封包格式(也是存储格式),在讲 PS 之前,先介绍几种相关的 数据格式概念: 1)ES 基本流 (Elementary Streams)是直接从编码 ...