Java 对象、引用和指针

来源:互联网 发布:php注入 编辑:程序博客网 时间:2024/05/21 18:38

在前面PersonTest.java代码中,有这样一行代码:Person p = new Person();
这行代码创建了一个Person实例,也被称为Person对象,这个Person对象被赋给p变量。

这行代码中实际产生了两个东西:一个是p变量,一个是Person对象。

从Person类定义来看,Person对象应该包含两个实例变量,而变量是需要内存来存储的。因此,当创建Person对象的实例变量。

Person对象由多块内存组成,不同内存块分别存储了Person的不同成员变量。当把这个Person对象赋给一个引用变量时,系统如何处理呢?难道把这个Person对象在内存里重新复制一份吗?显然不是,Java会让引用变量指向这个对象即可,也就是说,引用变量里存放的仅仅是一个引用,它指向实际的对象。

与前面介绍的数组类型类似,类也是一种引用数据类型,因此程序中定义的Person类型的变量实际上是一个引用,它被存放在栈内存里,指向实际的Person对象;而真正的Person对象则存在在堆(heap)内存中。

栈内存里的引用变量并未真正存储对象的成员变量,对象的成员变量数据实际存放在堆内存里:而引用变量只是指向该内存里的对象。
从这个角度来看,引用变量与C语言里的指针很像,它们都是存储一个地址值,通过这个地址来引用到实际对象。实际上,Java里的引用就是C里的指针。只是Java把这个指针封装了起来,避免进行繁琐的指针操作。

当这个对象创建成功后,这个对象将保存在堆内存中,Java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该做些。也就是说,不管是数组还是对象,都只能通过引用来访问它们。

堆内存里的对象可以有多个引用,即多个引用指向同一个对象,例如:

//将p变量的值赋给p2Person p2 = p;

上面把p变量的值赋给p2变量,也就是将p变量保存的地址赋给p2变量,这样p2变量和p变量将指向堆内存中同一个Person对象。不管访问p2变量的成员变量和方法,还是访问p变量的成员变量和方法,实际上是访问同一个Person对象的成员和方法。

如果内存的对象没有任何变量指向该对象,那么程序将无法访问该对象,这个对象也就变成垃圾。

3 1
原创粉丝点击