- 我在进行JDK源码测试发现一个问题:
Map<String, Double> map = new Map<>();会显示错误,
- 下面具体的解释一下:
- 首先Map是一个接口,它不能实例化,但是我感觉大家看到过这种情况
Thread t = new Thread(new Runable(){
@Override
public void run(){
}
}
Runable是一个接口,但是我们看到有new的情况,但是这种情况其实不是接口实例化,只是换了一种写法,写法如下:
class MyThread implements Runnable(){
@Override
public void run(){}
}
Thread t = new Thread(new MyThread());
只是省略了上面的写法。
- 接下来介绍一下接口为什么不能实例化
实例化实际上就是在JVM的堆中开辟一块内存空间,比如如下代码
Student t = new Student();
其中对象Student存放在堆的内存空间中,t指向内存空间的具体地址,这块地址存放的就是Student的一些属性,也就是Student的成员变量。
其中t存放在栈中,指向这个类的具体引用。
- 如果我们实例化接口,这个接口所占用的地址会存放什么值呢?
首先java的内存空间分为四类:栈,堆,代码,静态数据。由此可见接口中的值是存放在代码和静态数据,内存空间中是没有值的,所以实例化一个接口只会占用一个空间,不会实际存储什么值的。