浅谈Java中对象及对象引用

in Web with 0 comment

对象

浅谈Java中对象及对象引用

​ 在学习Java的过程中,通过阅读《Java核心技术卷1》及参考菜鸟教程等资料,发现对象及对象引用两个概念难以理解且容易混淆。对象和对象引用是两种完全不同的概念,本文浅谈了对象和对象引用的区别。

对象是什么?

​ 万物皆是对象,对象是类的一个实例,有状态和行为。《Java编程思想》提到:“按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词”

对象引用是什么?

“尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的’引用‘ ” ——《Java编程思想》

我们来看一个例子,我们首先定义一个对象变量:

Wife mywife = new Wife("Megumi");

那么这里的wife是一个对象,还是指向所创建的对象的引用呢?我们试着拆分下它

Wife mywife;
mywife = new Wife("Megumi");

尝试后可以发现效果是完全一样的,那么mywife还是是一个对象吗?在Java种new是用来在堆上创建对象的,如果mywife是一个对象,还需要通过new来创建对象吗?

在这里我们定义了一个对象变量mywife,但一定要认识到,对象变量不是一个对象,而且它实际上没有引用任何对象。

结论

​ 故可以得出结论,mywife并不是对象,而是指向对象的一个引用,指向Wife类对象的一个引用。真正创建对象是new所创建的对象。

​ 是不是有些熟悉的感觉?在C语言中指针也是指向了一个地址,在Java中对象变量可以类比为C++中的一个对象指针,对象变量存储了对对象的引用。

两者关系

​ Java对象和引用是互相关联,却又彼此独立。彼此独立主要表现在:引用是可以改变的,它可以指向别的对象。

​ 从存储空间上来说,对象和引用也是独立的,它们存储在不同的地方,对象一般存储在堆中,而引用存储在速度更快的堆栈中。

存储可改变性
对象一般是堆不可
引用堆栈

我们再看刚才的例子,当我们尝试以下赋值操作时:

Wife mywife;
wife = new Wife("Megumi");
Wife mywife2 = mywife;

这条语句使得两者指向同一个对象。在两个引用指向同一个对象的情况下,任意一个引用改变,均会改变对象的内容。

进一步结论

1.一个对象引用可以指向0个或1个对象

2.一个对象可以有多个引用指向它

参考资料

[1] JAVA 对象引用,以及对象赋值
[2] 浅谈Java中的对象和对象引用

评论区