InterfaceA是接口,new InterfaceA[2]正确吗?

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。


 

- 完 -

 

还在用构造方法给属性赋值?

"hello"+null = ?

读者交流 | JAVA过时了吗?

自己写的java.lang.String能用吗?

答疑 | synchronized有指令重排序的功能吗?

服了,list.add()也会报错!!!

10行代码2道题,全答对的你月薪多少了?

自己写的java.lang.String能用吗?

技术面试,这些坑你踩过几个?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值