1. 什么是对象?

任何事物都可以作为一个对象,一台电脑、一部手机等等等等。

在面向对象程序设计的 Java 中,程序是由对象组成的,对象包含了描述其状态的数据(属性)和可以执行的操作(方法),因此,每个对象都可以表示具体的事物或者抽象的规则、计划或事件。

类是构造对象的模板或蓝图,可以将类比作制造手机的流水线,而对象就是一台台手机。

由类构造对象的过程被称为创建类的实例,因此,也可以把对象称作实例。

2. 什么是对象引用?

每种语言都有自己的数据处理方式,因此,必须注意将要处理的数据是什么类型。

直接操作元素?还是某种基于特殊语法的间接表示(例如 C/C++ 的指针)来操作对象。

所有这些在 Java 中都进行了简化,一切都被视为对象。因此,可以采用一种统一的语法。

尽管将一切都 “ 看作 ” 对象,但操作的标识符实际是指向一个对象的 “ 引用 ”。

​ ——《Java 编程思想》

Java 中创建的对象都被放在成为 “ 堆 ” 的系统存储区中,对象都通过 “ 对象引用 ” 来访问。

一个类的变量持有一个对象,实际上是对该对象的引用。当变量不在引用任何对象时,该对象的引用就为 “ null ”。

具体来解释一下对象的创建:

Phone phone = new Phone();

通常会认为 phone 就是 Phone 类的对象。实际上phone 是创建 Phone 类的对象的引用。

这个表述实际上执行的操作:

  1. new Phone() 是在内存中为对象开辟空间。其实也就是 new 关键字表示在内存的 堆(heap) 上为对象开辟空间,该空间保存了对象的属性和方法。
  2. Phone phonephone 指代一个 Phone 对象,被称为 对象引用实际上phone 并不是对象本身,而是一个类似执行对象的指针。phone 存在于内存的 栈(stack) 中。
  3. 当用等号赋值时,是将右侧 new Phone() 在堆中创建对象的地址赋给对象引用 phone

为什么要这样操作?简单来讲,有以下几种优点:

  1. 栈的读取速度比堆块,但栈上存储的数据受到有效范围的限制。

  2. 一个对象引用可以赋值给另一个对象引用,此时复制的实际上是对象的地址。因此,一个对象可以由多个对象引用,减少对内存的消耗。

    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

从结果来看,似乎方法已经修改了 phoneprice,变量值已经发生了改变。

实际上,方法拿到的是 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 按引用传递?相关推荐

  1. Java架构师必知必会,带走不谢

    可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...

  2. java的标量和聚合量_第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  3. java面试必知必会

    java面试必知必会 面向对象 成员变量成员方法 Integer相关 double 和 Double相关 多态,向上转型 hashcode.==.equals比较 java中子类继承父类时是否继承构造 ...

  4. 必知必会系列-JAVA虚拟机原理

    系列文章 必知必会系列-Spring技术原理 必知必会系列-JAVA虚拟机原理 必知必会系列-Redis技术原理 引言 随着技术的不断演进,在不同时间阶段都会有不同的技术产物,那么如何快速的学习和掌握 ...

  5. Java XxlJob 必知必会<续篇>

    通过 Java  XxlJob 必知必会 这篇文章的学习,我们大致知道了 xxljob 是做什么的,今天这篇文章我们将继续研究一下 xxljob 的其他使用场景. Step1: 创建一个运行模式为 P ...

  6. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  7. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  8. SpringBoot入门到精通_第6篇 _必知必会

    接上一篇:SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控 https://blog.csdn.net/weixin_40816738/article/detail ...

  9. 《MySQL必知必会》.pdf

    什么是数据库? 数据库是大量数据的集合,通常以电子形式进行数据存储. 数据库的设计通常是为了使其易于存储和访问信息.数据库的使用对任何公司或组织都至关重要,这是因为数据库存储了有关公司的所有相关详细信 ...

  10. 分享一个开源的项目,数据结构和算法必知必会的50个代码实现

    数据结构和算法必知必会的50个代码实现 这个开源项目是有前Google工程师打造出来的,使用了c,go,java,python,php等很多中语言实现了一些数据结构和算法,对于喜欢算法的来说可谓是一个 ...

最新文章

  1. 番外:Spring MVC环境搭建和Mybatis配置避坑篇
  2. matlab imadjust 用 opencv改写
  3. 数据可视化(matplotlib绘图)
  4. 用 Python 做数据处理必看:12 个使效率倍增的 Pandas 技巧(上)
  5. python time,datetime当前时间,昨天时间,时间戳和字符串的转化
  6. 基于Maven的SSH框架搭建
  7. python第三方库引用_Python入门:如何使用第三方库
  8. HDU 6170 2017 多校训练:Two strings(DP)
  9. C++的三种交换数值的方式(值传递、地址传递、引用传递)
  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-1.整合Mybatis访问数据库和阿里巴巴数据源...
  11. Cross-entropy 和 Binary cross-entropy
  12. 几个项目管理经典小故事,发人深思
  13. 数据分析--Python连接阿里云数据库
  14. nuxt整合vue-pdf插件和使用createLoadingTask方法进行分页
  15. 分辨率并不是越高越好,因为人眼分辨能力存在极限
  16. 卷积神经网络实现手写数字集
  17. python:在指定范围内按学号随机生成座位顺序,并分行输出
  18. IP-guard桌面终端安全解决方案
  19. Babel转码器(ES6)
  20. 4094. Spiral matrix

热门文章

  1. windows 配置虚拟主机
  2. mysql error 11_mysqld报InnoDB: Unable to lock ./ibdata1 error: 11
  3. 网络设备自动备份工具 Oxidized 使用体验
  4. linux git 撤销删除文件,删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库...
  5. 墨天轮数据库在线实训平台发布,这份操作指南助你快速上手
  6. 2021-10-06 统计学-基于R(第四版)第一章课后习题记录及总结
  7. ERPNext关键业务流程
  8. 2017中国程序员薪资调查:平均薪资10K!
  9. HTML5中的audio在手机端和 微信端的自动播放
  10. LocalDateTime日期格式转换问题