这个问题在这里已有答案:
Array of abstract class 8个答案
Java - Why declare an array as a type of Interface? 1回答
我刚刚复制了一行程序,如果你可以向我解释一下 . 谢谢
Runnable r[] = new Runnable[5];
通过对 Runable 数组进行延迟,您不会创建 Runable 接口的任何对象,而是 an object of a certain java array class . 所以编译器不会给出任何错误 . 您只是声明一个数组,其中元素必须是某些类的对象,这些类实现了 Runable 接口 .
Runable
来自JLS:
每个数组都有一个关联的Class对象,与具有相同组件类型的所有其他数组共享 . [This]就像:数组类型的直接超类是Object [和]每个数组类型实现接口Cloneable和java.io.Serializable .
您没有使用此行初始化任何元素,因此您尚未实现该接口 . 此时您不需要为类型接口的数组分配空间 . 在程序的后面,元素很可能被初始化,当它们完成时,它们完成了接口的实现,而不是接口本身 .
它是 only 一个引用数组,并且在通过创建新的 Runnable 对象初始化引用本身之前初始化是不完整的 .
Runnable
正如answer明确指出:
对于引用(包含对象的任何内容)为null .
你总能写:
interface Foo{} Foo foo = null;
new Runnable[5] 创建一个 array 的 Runnable 类型 . 它没有实例化 Runnable .
new Runnable[5]
无效代码将是一个caling new Runnable() . 换句话说,不允许的是接口类型的直接实例化,但是您可以创建一个类型为接口的数组 .
new Runnable()
4 回答
通过对
Runable
数组进行延迟,您不会创建Runable
接口的任何对象,而是 an object of a certain java array class . 所以编译器不会给出任何错误 . 您只是声明一个数组,其中元素必须是某些类的对象,这些类实现了Runable
接口 .来自JLS:
您没有使用此行初始化任何元素,因此您尚未实现该接口 . 此时您不需要为类型接口的数组分配空间 . 在程序的后面,元素很可能被初始化,当它们完成时,它们完成了接口的实现,而不是接口本身 .
它是 only 一个引用数组,并且在通过创建新的
Runnable
对象初始化引用本身之前初始化是不完整的 .正如answer明确指出:
你总能写:
new Runnable[5]
创建一个 array 的Runnable
类型 . 它没有实例化Runnable
.无效代码将是一个caling
new Runnable()
. 换句话说,不允许的是接口类型的直接实例化,但是您可以创建一个类型为接口的数组 .