理解Java引用数据类型:它们都是对象引用

简介: 本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。

theme: cyanosis

image.png

引用数据类型的本质

引用数据类型变量存储的是对象的引用(内存地址),而非对象本身。

想象一下:如果对象是一栋房子,那么引用就是这栋房子的地址。当你写:

Person p1 = new Person("张三", 25);

这里发生了两件事:

  1. 在堆内存中创建了一个Person对象
  2. p1变量存储了这个对象的"地址"(引用)

当进行赋值操作时:

Person p2 = p1;

我们只是复制了地址,而不是复制了房子。现在p1p2都指向同一栋"房子"(同一个对象)。

Java中的引用类型家族

Java中的所有引用类型都遵循这一原则:

  • 类(Class): String、自定义类等
  • 接口(Interface): ListMap
  • 数组(Array): 即使是基本类型数组,数组本身仍是引用类型
  • 枚举(Enum): 本质上是特殊的类

引用比较与内容比较

理解引用的本质,可以解释很多Java编程中的"谜题":

String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

System.out.println(s1 == s2);    // true,同一个字符串池中的对象
System.out.println(s1 == s3);    // false,不同的对象引用
System.out.println(s1.equals(s3)); // true,内容相同

这就像两张纸上写着相同的地址——地址相同(==为true),或两张纸上写着不同地址但指向外观完全相同的房子(equals()为true)。

包装类的缓存机制

Java的设计者为提高性能,对常用的小数值包装类对象进行了缓存:

Integer a = 100;
Integer b = 100;
System.out.println(a == b);      // true,使用了同一个缓存对象

Integer c = 1000;
Integer d = 1000;
System.out.println(c == d);      // false,超出缓存范围,创建了不同对象

这就像在一个小区里,1-127号房子是公司统一建好的标准户型(缓存),而更大号码的房子则是按需定制建造的。

总结

  1. Java中,引用类型变量是对象的"遥控器",而不是对象本身
  2. 所有非基本类型的变量都是引用
  3. 引用的行为解释了==equals()的区别
  4. 包装类的缓存机制是性能优化的结果

理解引用的本质,能够避免许多常见错误,尤其是在处理对象相等性、参数传递和集合操作时。引用是Java内存模型的基础,掌握它将使你的编程之路更加顺畅。

目录
相关文章
|
2月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
44 12
|
20天前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
64 23
|
27天前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
2月前
|
设计模式 缓存 Java
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
107 3
|
2月前
|
Java
课时12:Java数据类型划分(字符型)
课时12介绍了Java中的字符型数据(char),包括字符的定义、与int类型的转换及应用。通过范例展示了如何观察字符、编码转换、大小写字母互转、保存中文字符,以及Java中字符处理的灵活性。字符型使用单引号声明,可与int互相转换,支持Unicode编码,能表示任何文字,包括中文。虽然实际开发中直接操作字符型的情况不多,但理解其特性有助于更好地编程。
74 17
|
1月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
37 0
|
2月前
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
86 15
|
2月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
2月前
|
Java
课时13:Java数据类型划分(布尔型)
观察布尔型的操作。布尔是一位数学家的名字,这个布尔发明了两个单词:True、False(一个表示真一个表示假)。一般布尔类型都只表示逻辑的计算结果。
|
2月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问

热门文章

最新文章