gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:11:42 24 4
gpt4 key购买 nike

在继续我的在线教程时,我遇到了这节课。我有一个接口(interface)和两个实现该接口(interface)的类。

public interface Payable {
double getPaymentAmount();
}

  • Invoice 实现上述接口(interface) Payable
  • SalariedEmployee 扩展抽象类 Employee 实现 Payable 接口(interface)。
  • 一个测试类,其中包含对此进行测试的主要方法。

现在在测试类中,当创建一个对象数组时,对象的类型被称为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com