java - 在Java多态性中,所有实现接口(interface)的类都可以创建为该类型接口(interface)吗?

标签 java interface polymorphism super implements

当我继续学习在线教程时,我遇到了这节课。我有一个接口(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 并以某种方式期望创建任何 InvoiceSalariedEmployee 对象。

但是您可以将 Payable 点的引用指向任何实现 Payable 的对象。这几乎就是子类型多态性的基本思想。

示例中发生的情况是创建了一个包含四个 Payable 引用的数组。这些引用尚未指向任何内容(它们为空),并且还没有 InvoiceSalariedEmployee 对象,只有数组对象。

然后,代码创建两个对象并将它们分配给其中两个引用。这与数组元素是自变量的情况相同。 (几乎,但差异是由于数组协方差造成的,此时这并不重要。)特别是,new 运算符的结果具有 Invoice 类型第一种情况,不是Payable。您可以将Invoice 分配给Payable 引用,但转换发生在分配时,而不是创建时。

因此,从技术上讲,您的标题问题的答案是“不,对象始终按照您在 new 表达式中指定的类型创建,但您可以在之后转换引用”。

关于java - 在Java多态性中,所有实现接口(interface)的类都可以创建为该类型接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799637/

相关文章:

java - 为什么叫它 "method hiding"?

java - 缩小 Java 字段类型而不使封闭类通用?

c++ - 从接口(interface)访问具体类的 "this"指针

带有字符串类型的 Delphi 泛型接口(interface)

go - 有没有一种方法可以通用地表示一组相似的函数?

c# - new() 约束对类定义有何作用?

c++ - C 或 C++ 中的多态引擎

java - 如何排除 Fortify 中的警告?

java - 为什么将 k-ary 树表示为左子树、右兄弟树?

java - 使用处理存储从串行连接读取的 Arduino 数据