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.重载是在同一个类中,可声明多个同名方法,但参数列表不同(参数顺序,个数,类型).而重写是在子类中,对从父类中继承的方法进行重新编写,但方法名,参数列表(参数顺序,个数,类型),返回值类型必须保持一 ...
随机推荐
- sed、awk工具
ed sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.s ...
- 1054 The Dominant Color (20)(20 分)
Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits of i ...
- PowerBuilder 这么古老的语言(破解一软件)
PowerBuilder 这么古老的语言,编辑器用的6.5的好古老的气息,好吧破解木有兴趣了, 不过嘛可以说一下破解思路,这个系统使用的是圣天狗,联网版的. 复制狗(暴力,没技术味道) 模拟狗(也是 ...
- beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)
具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...
- CF1215题解
E 假设从小到大排序,每次交换相邻两个,最小次数即冒泡排序也就是逆序对 考虑值域较小,把每个值映射到\([1,20]\) 设\(f_i\)为已经加入集合为\(i\)的值的最小逆序对个数,考虑填表法 即 ...
- #C++初学记录#日常学习函数
静态变量static,只进行一次初始化. #include<cstring> #include<iostream> using namespace std; int main( ...
- JVM 初始化阶段例子
创建如下Demo package com.example.jvm.classloader; class Parent{ static int a = 3; static { System.out.pr ...
- Eclipse 搭建Struts2
Eclipse版本 Mars Release (4.5.0) Struts版本 struts-2.5.20 下载地址:https://struts.apache.org/download.cgi#st ...
- Tensorflow 2 Cifar10离线数据集手动下载、离线安装、本地加载、快速读取
Tensorflow 2 Cifar10离线数据集手动下载.离线安装.本地加载.快速读取 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 查 ...
- css3画半圆的两种方法
<html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...