25-认识引用类型
0. 目录
- 引用(reference)数据类型
- 引用数据类型和基本数据类型
- Java 有一个大大的布告板,放着所有实例
1. 引用(reference)数据类型
1.1 Java 中的数据类型分为基本数据类型和引用数据类型
- 基本数据类型就是:int、char.....
- 引用数据类型:数组变量、对象变量。
1.2 看例程,理解引用
// Merchandise.java
public class Merchandise {
String name;
String id;
int count;
double price;
}
public class ReferenceAndPrimaryDataType {
public static void main(String[] args) {
// >> TODO m1 是一个 Merchandise 类型的引用,只能指向 Merchandise 类型的实例
// >> TODO 引用数据类型变量包含两部分信息:类型和实例。也就是说,
// TODO 每一个引用数据类型的变量(简称引用),都是指向某个类( class /自定义类型)
// TODO 的一个实例/对象(instance / object)。不同类型的引用在 Java 的世界里都是引用。
// >> TODO 引用的类型信息在创建时就已经确定,可以通过给引用赋值,让其指向不同的实例.
// 比如 m1 就是 Merchandise 类型,只能指向 Merchandise 的实例。
Merchandise m1; // TODO:>>>引用类型,并没有像 int、double 一样,拥有一个明确的名字。引用类型就像下面所有用类来引用创建的变量,都是引用类型。
m1 = new Merchandise();
Merchandise m2 = new Merchandise(); // TODO:>>一手牵着类型,一手牵着实例,这就是引用
Merchandise m3 = new Merchandise();
Merchandise m4 = new Merchandise();
Merchandise m5 = new Merchandise();
// >> TODO 给一个引用赋值,则两者的类型必须一样。m5可以给m1赋值,因为他们类型是一样的
m1 = m5; // m1 和 m2 的地址是不一样的,但是指向的地址是一样的。
System.out.println("m1=" + m1);
System.out.println("m2=" + m2);
System.out.println("m3=" + m3);
System.out.println("m4=" + m4);
System.out.println("m5=" + m5);
Merchandise m6 = m1;
System.out.println("m6=" + m6);
m6 = m5;
System.out.println("m6=" + m6);
System.out.println("m1=" + m1);
System.out.println("m2=" + m2);
System.out.println("m3=" + m3);
System.out.println("m4=" + m4);
System.out.println("m5=" + m5);
int a = 999;
}
}
2. 引用数据类型和基本数据类型
2.1 引用数据类型和基本数据类型的相同点
- 都可以用来创建变量,可以赋值和使用其值
- 本身都是一个地址
2.2 引用数据类型和基本数据类型的不同点
- 基本类型变量的值,就是地址对应的值。引用数据类型的值还是一个地址,需要通过 “二级跳”找到实例
- 引用数据类型是 Java 的一种内部类型,是对所有自定义类型和数组引用的统称,并非特指某种类型
3. 尝试输出一下引用类型的值到控制台,看看是什么
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58585:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/aiyuechuang/GitHubPage/Java_Coder/Coder33/out/production/Coder33 ReferenceAndPrimaryDataType
m1=Merchandise@60f82f98
m2=Merchandise@35f983a6
m3=Merchandise@7f690630
m4=Merchandise@edf4efb
m5=Merchandise@60f82f98
m6=Merchandise@60f82f98
m6=Merchandise@60f82f98
m1=Merchandise@60f82f98
m2=Merchandise@35f983a6
m3=Merchandise@7f690630
m4=Merchandise@edf4efb
m5=Merchandise@60f82f98
Process finished with exit code 0
如果是基本类型,那么这块地址“对应的内存里”的值就是这个基本类型的值;如果是引用类型,那么这块地址“对应的内存里”存储的“值”是堆中这个实例的地址。
3. Java 有一个的大大的布告板,放着所有实例
Merchandise m1 = new Merchandise();
- 使用 new 操作符可以创建某个类的一个实例。在 Java 程序运行的时候,所有这些创建出来的实例都被 Java 放在内存里一个叫做堆(heap)的、类似公告板的地方「
new Merchandise()
:创建一个对象,m1 本身是一个地址」 - 创建一个实例,就是根据类的定义,点出需要的“纸”,订成一个本子,挂在布告板上。实例本身,可以认为是一个小本子
- 引用里存放的,相当于某个本子所在的布告板的地址
- String 其实也就是我的引用类型,是 Java 自带的类,不是我们自带的类,但是使用上是没有什么区别的。
我们知道,每种固定的数据类型,占用的空间大小是固定的。例如:int:4byte
、double:8byte
、引用数据类型,占用的大小是多少呢?——它也是固定的,跟你安装的 JDK 的版本有关系。如果,你安装的是 64bit,那它就占用 64 bit,也就是 8个 byte。32bit:4个 byte。
4. 提问
Q1
听了课还是不明白引用和对象之间的关系,比如 Merchantdise m1 = new Merchantdise();
那么Merchantdise 是类,m1 是对象,那么 m1 还是引用是吗?这么说引用和对象是一个东西嘛?
我:
new Merchantdise()
创建了一个对象,但是这个对象,只能通过应用来指向,才能实际操作。
举个例子,对象就是一座房子。引用就是一张纸条。纸条上可以写这座房子的地址,当然也可以写另外一座房子的地址。如果你想去这个房子住,不能到处驮着这个房子,遇到一个人,说,来住一天吧?你应该给这个人看这个纸条,这房子要不要住一天?
同样的道理,对象是在内存里的一块数据。不能搬着它到处走(当然也有搬着它到处走的语言,那是另一种思路,Java 不行),只能手上拿着个纸条(引用),记录对象的地址(给引用赋值),然后通过这个纸条,可以随时找到这个内存里的对象,进而对它进行操作。
Q2
类是对象的模板,对象是类的一个实例。 智人(类)是中国人,美国人…(这些对象)的模板,中国人…等人是智人的一个实例。
我:
理解到位了。 更精准的说,中国人美国人都是智人的子类,一个具体的小明和 Jack 是中国人和美国人的实例
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
- 0
- 0
- 0
- 0
- 0
- 0