interface InterfaceA{
}
如上代码,InterfaceA是接口类型的。那么new InterfaceA[2]正确吗?
|
|
|
|
|
|
|
|
|
|
答案:正确。
本题的考点是:对象数组。对象数组实际存放的不是对象本身,而是对象引用的地址。
先看以下代码。
Object obj = new Object();
System.out.println(obj);
obj的运行结果是:java.lang.Object@61bbe9ba,也就是new Object()对象在堆内存中的地址(以toString()形式体现而已)。
如果严格从语法来讲,java中“万物皆对象”是没有任何问题的。但一般而言,我们所说的“对象”指的是堆内存中的对象;栈内存中的对象有一个更合适的叫法——“引用”,引用存放的就是堆内存中对象的地址。例如,以上代码中new Object()是在堆内存中开辟一块空间并存放属性等各种数据,而栈内存中的obj存放的是刚才new Object()在堆内存中的地址(即地址是java.lang.Object@61bbe9ba),如图所示。
重要的事情多说几遍:
引用存放的就是堆内存中对象的地址
引用存放的就是堆内存中对象的地址
引用存放的就是堆内存中对象的地址
再看一下对象数组。顾名思义,对象数组是一个数组,并且数组元素是对象类型的。回到本节一开始提到的:对象数组实际存放的不是对象本身,而是对象的引用地址。因此,在newInterfaceA[2]这个对象数组中,存放的就是InterfaceA对象的引用地址,引用指向谁呢?指向堆地址,但本题没有new Interface(),因此不存在堆地址,所以引用地址是空,即null。因此new InterfaceA[2]实际存放的就是{null,null}。
最后来验证一下。
public static void main(String[] args) {
InterfaceA []inters = new InterfaceA[2];
System.out.println(inters[0]);
System.out.println(inters[0]);
}
运行结果:
null
null
本验证程序也可以这么理解:
inters中存放的是两个InterfaceA类型的对象堆地址,但目前在堆内存中还不存在InterfaceA类型的对象,因此inters的元素值都是null。
如果还理解不了,不妨换个角度想想:接口不能new,但本题new的是数组,根本没有对接口进行new操作。而数组的元素值是引用,引用存放的是对象堆地址,本题没有new对象就不存在堆地址,因此堆地址是null。综上,堆地址是null,说明引用值是null,进而也就说明了数组元素是null。
- 完 -