Java 匿名对象和对象就是一个能否不断得到实例化对象内存引用的区别

时间:2022-01-24 16:16:50

对象的声明与实例化过程

类名 对象名 = new 类名() ;

Person p ; // 先声明一个 Person 类的对象 p
p = new Person() ; // 用 new 关键字实例化 Person 的对象 p

**
这里分别做了两件事:
1、 声明指向”由类所创建的对象”的变量
2、 利用 new 创建新的对象,并指派给先前所创建的变量。**
Java 匿名对象和对象就是一个能否不断得到实例化对象内存引用的区别
从图片中可以看出,当我们声明对象的时候只是在堆内存中存了一个变量,当用new实例化对象分配内存的时候会在堆内存中存储变量和方法的地址引用,方法存在方法区内,然后再把堆内存的地址引用赋值给声明的对象来保存。所以只有得到实例化对象的内存地址引用才能调用里面的属性和方法。

匿名对象

上面说了只有拿到实例化对象的内存地址引用才能调用类里面的方法和属性,而声明的对象的作用就是用来保存这个地址引用的,保证我们想用的时候可以直接拿到。那么如果我不声明一个对象来保存这个引用呢?那么,这个对象就是匿名对象,没有名字的对象,但是在内存中是真实存在的,但是用过一次,再也无法得到他的内存地址的引用,因为当我们再new的时候它又是另外一个实例化的对象了,所以它是一次性的。

new 构造方法();

对象的比较

比较对象时,如果两个对象的实例化对象的内存引用一样,那么他们的内容就一样,属于同一个实例化对象。

Person p1=new Person();
Person p2=p1;

这个时候他们的内存引用指向的是同一个实例化的对象。
==比较的是两个对象的内存引用是否一样,equse()比较的是两个对象的内容是否一样。