• 复制引用:把原对象的地址赋给了一个新的引用变量,只要其中一个对象的属性发生变化,另一个对象的属性也随之发生变化。

  • 复制对象:把原对象的内容赋给了一个新的对象,其中一个对象的属性发生变化,并不影响另一个对象的属性。

举例:被复制对象为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面试 - 复制引用和复制对象的区别?的更多相关文章

  1. Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

  2. 22.Java面试学习平台-整合OSS对象存储

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  3. java面试-强引用、软引用、弱引用和幻象引用有什么区别

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响. 1 .强 ...

  4. java两个引用指向同一个对象

  5. Java面试——String、StringBuider以及StringBuffer的区别和使用场景

    1.  String.StringBuider.StringBuffer的区别  String是不可变的对象,因此在每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指 ...

  6. Java面试 - final、finally、finalize的区别?

    final:用于声明属性, 方法和类,分别表示属性不可变.方法不可覆盖.被其修饰的类不可继承. finally:异常处理语句结构的一部分,表示总是执行. finalize:Object 类的一个方法, ...

  7. java实现面向对象和javaScript基于对象的区别&java垃圾回收机制和其他编程语言的比较

    java javaScript javaGC和C语言内存分配和内存释放

  8. Java 有状态和无状态对象的区别

    无状态会话Bean   无状态就是对于一次操作,不能保存数据.无状态对象(Stateless Bean)是没有实例变量的对象,不能保存数据,是不变类,是线程安全的.例如:  public class ...

  9. Java面试 - 重载(Overload)和重写(Override)的区别?

    1.重载是在同一个类中,可声明多个同名方法,但参数列表不同(参数顺序,个数,类型).而重写是在子类中,对从父类中继承的方法进行重新编写,但方法名,参数列表(参数顺序,个数,类型),返回值类型必须保持一 ...

随机推荐

  1. 【转】浅析Linux中的零拷贝技术

    本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景.为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件 ...

  2. Mac 上 QuickTime Player 播放器以 1.1、1.2 倍速等更精确速度快进/快退播放的方法

    苹果的 QuickTime Player 播放器上点击双箭头按钮可以用 2.4.8 倍的速度快进/快退播放视频,但是 2 倍速太快了,如果我想以 1.1.1.2 倍速这种更精确的速度控制视频播放呢?按 ...

  3. Deepin-TIM或Deepin-QQ调整界面DPI字体大小的方法

    Deepin-TIM或Deepin-QQ调整界面DPI字体大小的方法 env WINEPREFIX="/home/landv/.deepinwine/Deepin-QQ" deep ...

  4. nvarchar(MAX) 、ntext的差别

    今天在做一个项目时,程序成功向数据库插入一条数据, 插入的是一篇比较大的文章,而且还有很多样式. Id是int型,Content用的是 ntext类型的 但是当我在手动改数据库Id时出现错误: 错误源 ...

  5. mac webstorm 安装破解

    下载: 链接:https://pan.baidu.com/s/1A1afhcpPWMrQtOr1Suqs-g  密码:5r7b 激活码 K6IXATEF43-eyJsaWNlbnNlSWQiOiJLN ...

  6. python 链表的实现

    code #!/usr/bin/python # -*- coding: utf- -*- class Node(object): def __init__(self,val,p=): self.da ...

  7. Java 基础:单例模式 Singleton Pattern

    1.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  8. UDF-C_UDMI【转载】

    UDF定义变量的输出 使用宏: C_UDMI( c, thread, index)       自变量类型:cell_t c       Thread *thread       int index ...

  9. 2019年7月第一周总结-RabbitMQ总结

    这一周主要是对RabbitMQ做了一下学习. 快速阅读 RabbitMq的介绍以及环境安装配置,以及RabbitMq的六种应用 .单生产者和消费者, 单生产者多消费者,消息的发布订阅,消息类型Echa ...

  10. Thingsboard学习之三启动Thingsboard

    关于安装Docker和Docker-Compose,参考<Thingsboard学习之二安装Docker和Docker-Compose> 首先检查一下是否有安装git yum instal ...