当我继续学习在线教程时,我遇到了这节课。我有一个接口(interface)和两个实现该接口(interface)的类。
public interface Payable {
double getPaymentAmount();
}
和
- 类
Invoice
实现上述接口(interface)Payable
- 类
SalariedEmployee
扩展了实现Payable
接口(interface)的抽象类Employee
。 - 一个测试类,其中包含用于测试的主要方法。
现在在测试类中,创建对象数组时,对象的类型被称为 Payable[]
而不是 SalariedEmployee[]
或 发票[]
,例如
public static void main(String[] args) {
Payable[] payableObjects = new Payable[4];
payableObjects[0] = new Invoice("0000", "abc", 1,2);
payableObjects[1] = new SalariedEmployee("test", "user", "000-000", 35);
- 这是因为所有类都实现了 Payable[] 接口(interface)吗?
- 如果在顶层层次结构中定义接口(interface),是否总是可以创建实现该接口(interface)的所有类的对象?
最佳答案
您的问题标题不符合语法,但单词选择表明存在对概念的微妙误解。
您只能创建一个类作为该类。也就是说,您不能编写 new Payable
并以某种方式期望创建任何 Invoice
或 SalariedEmployee
对象。
但是您可以将 Payable
点的引用指向任何实现 Payable
的对象。这几乎就是子类型多态性的基本思想。
示例中发生的情况是创建了一个包含四个 Payable
引用的数组。这些引用尚未指向任何内容(它们为空),并且还没有 Invoice
或 SalariedEmployee
对象,只有数组对象。
然后,代码创建两个对象并将它们分配给其中两个引用。这与数组元素是自变量的情况相同。 (几乎,但差异是由于数组协方差造成的,此时这并不重要。)特别是,new
运算符的结果具有 Invoice
类型第一种情况,不是Payable
。您可以将Invoice
分配给Payable
引用,但转换发生在分配时,而不是创建时。
因此,从技术上讲,您的标题问题的答案是“不,对象始终按照您在 new
表达式中指定的类型创建,但您可以在之后转换引用”。
关于java - 在Java多态性中,所有实现接口(interface)的类都可以创建为该类型接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799637/