Java 必知必会——什么是对象引用?按值传递 OR 按引用传递?
1. 什么是对象?
任何事物都可以作为一个对象,一台电脑、一部手机等等等等。
在面向对象程序设计的 Java 中,程序是由对象组成的,对象包含了描述其状态的数据(属性)和可以执行的操作(方法),因此,每个对象都可以表示具体的事物或者抽象的规则、计划或事件。
类是构造对象的模板或蓝图,可以将类比作制造手机的流水线,而对象就是一台台手机。
由类构造对象的过程被称为创建类的实例,因此,也可以把对象称作实例。
2. 什么是对象引用?
每种语言都有自己的数据处理方式,因此,必须注意将要处理的数据是什么类型。
直接操作元素?还是某种基于特殊语法的间接表示(例如 C/C++ 的指针)来操作对象。
所有这些在 Java 中都进行了简化,一切都被视为对象。因此,可以采用一种统一的语法。
尽管将一切都 “ 看作 ” 对象,但操作的标识符实际是指向一个对象的 “ 引用 ”。
——《Java 编程思想》
Java 中创建的对象都被放在成为 “ 堆 ” 的系统存储区中,对象都通过 “ 对象引用 ” 来访问。
一个类的变量持有一个对象,实际上是对该对象的引用。当变量不在引用任何对象时,该对象的引用就为 “ null ”。
具体来解释一下对象的创建:
Phone phone = new Phone();
通常会认为 phone
就是 Phone
类的对象。实际上,phone
是创建 Phone
类的对象的引用。
这个表述实际上执行的操作:
new Phone()
是在内存中为对象开辟空间。其实也就是new
关键字表示在内存的 堆(heap) 上为对象开辟空间,该空间保存了对象的属性和方法。Phone phone
:phone
指代一个Phone
对象,被称为 对象引用。实际上,phone
并不是对象本身,而是一个类似执行对象的指针。phone
存在于内存的 栈(stack) 中。- 当用等号赋值时,是将右侧
new Phone()
在堆中创建对象的地址赋给对象引用phone
。
为什么要这样操作?简单来讲,有以下几种优点:
栈的读取速度比堆块,但栈上存储的数据受到有效范围的限制。
一个对象引用可以赋值给另一个对象引用,此时复制的实际上是对象的地址。因此,一个对象可以由多个对象引用,减少对内存的消耗。
Phone phone1 = new Phone(); Phone phone2; phone2 = phone1; // phone1 与 phone2 引用的是同一个对象,对phone1修改,phone2也会随之修改
3. 对象引用意味着 Java 是按引用传递?
首先回顾一下,将参数传递给方法的两种情况:
- 按值调用:表示方法接收的是调用者提供的值。
- 按引用调用:表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
方法参数有两种类型:
基本数据类型:不能修改值调用所对应的变量值。
public static void add(int a, int b) {a = a + b; // a = 3
}
int a = 1;
int b = 2;
add(a, b);
// a = 1
对象引用
@Getter
@Setter
@AllArgsConstructor
class Phone {private Double price;public void discount() {price = price * 0.7;}
}Phone phone1 = new Phone(2000.00);
phone1.discount();
System.out.println(phone1.getPrice()); // 1400.00
从结果来看,似乎方法已经修改了 phone
的 price
,变量值已经发生了改变。
实际上,方法拿到的是 phone
对象引用的拷贝,也就是复制了一个对象地址,因此方法中对phone
属性 price
的修改,也会会作用 phone1
对象引用上。
那么,方法是否能改变对象引用的地址呢?
实际操作一下:
Phone phone1 = new Phone(2000.00);
modifyPhone(phone1);
System.out.println(phone1.getPrice()); // 2000.00public static void modifyPhone(Phone phone) {phone = new Phone(1000.00);System.out.println(phone.getPrice()); // 1000.00
}
结果很明显,方法是不能改变对象引用的地址。
换句话说,Java 程序设计语言总是按值调用。不要被 “ 对象引用 ” 这四个字迷惑了双眼,错误地人文 Java 对对象采用的是引用调用。
Java 必知必会——什么是对象引用?按值传递 OR 按引用传递?相关推荐
- Java架构师必知必会,带走不谢
可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...
- java的标量和聚合量_第5节:Java基础 - 必知必会(下)
第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...
- java面试必知必会
java面试必知必会 面向对象 成员变量成员方法 Integer相关 double 和 Double相关 多态,向上转型 hashcode.==.equals比较 java中子类继承父类时是否继承构造 ...
- 必知必会系列-JAVA虚拟机原理
系列文章 必知必会系列-Spring技术原理 必知必会系列-JAVA虚拟机原理 必知必会系列-Redis技术原理 引言 随着技术的不断演进,在不同时间阶段都会有不同的技术产物,那么如何快速的学习和掌握 ...
- Java XxlJob 必知必会<续篇>
通过 Java XxlJob 必知必会 这篇文章的学习,我们大致知道了 xxljob 是做什么的,今天这篇文章我们将继续研究一下 xxljob 的其他使用场景. Step1: 创建一个运行模式为 P ...
- c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战
本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
为什么80%的码农都做不了架构师?>>> 本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...
- SpringBoot入门到精通_第6篇 _必知必会
接上一篇:SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控 https://blog.csdn.net/weixin_40816738/article/detail ...
- 《MySQL必知必会》.pdf
什么是数据库? 数据库是大量数据的集合,通常以电子形式进行数据存储. 数据库的设计通常是为了使其易于存储和访问信息.数据库的使用对任何公司或组织都至关重要,这是因为数据库存储了有关公司的所有相关详细信 ...
- 分享一个开源的项目,数据结构和算法必知必会的50个代码实现
数据结构和算法必知必会的50个代码实现 这个开源项目是有前Google工程师打造出来的,使用了c,go,java,python,php等很多中语言实现了一些数据结构和算法,对于喜欢算法的来说可谓是一个 ...
最新文章
- 番外:Spring MVC环境搭建和Mybatis配置避坑篇
- matlab imadjust 用 opencv改写
- 数据可视化(matplotlib绘图)
- 用 Python 做数据处理必看:12 个使效率倍增的 Pandas 技巧(上)
- python time,datetime当前时间,昨天时间,时间戳和字符串的转化
- 基于Maven的SSH框架搭建
- python第三方库引用_Python入门:如何使用第三方库
- HDU 6170 2017 多校训练:Two strings(DP)
- C++的三种交换数值的方式(值传递、地址传递、引用传递)
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-1.整合Mybatis访问数据库和阿里巴巴数据源...
- Cross-entropy 和 Binary cross-entropy
- 几个项目管理经典小故事,发人深思
- 数据分析--Python连接阿里云数据库
- nuxt整合vue-pdf插件和使用createLoadingTask方法进行分页
- 分辨率并不是越高越好,因为人眼分辨能力存在极限
- 卷积神经网络实现手写数字集
- python:在指定范围内按学号随机生成座位顺序,并分行输出
- IP-guard桌面终端安全解决方案
- Babel转码器(ES6)
- 4094. Spiral matrix
热门文章
- windows 配置虚拟主机
- mysql error 11_mysqld报InnoDB: Unable to lock ./ibdata1 error: 11
- 网络设备自动备份工具 Oxidized 使用体验
- linux git 撤销删除文件,删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库...
- 墨天轮数据库在线实训平台发布,这份操作指南助你快速上手
- 2021-10-06 统计学-基于R(第四版)第一章课后习题记录及总结
- ERPNext关键业务流程
- 2017中国程序员薪资调查:平均薪资10K!
- HTML5中的audio在手机端和 微信端的自动播放
- LocalDateTime日期格式转换问题