Java-多态性 : legal vs illegal declarations

标签 java inheritance polymorphism

                                      ANIMAL
                                  /           \
                      VERTEBRATE             INVERTEBRATE
                     /     |     \           /     |     \
                   CAT    DOG    COW      SPIDER  ANT   CORAL
                  /   \
          COLOR_SOLID CALICO

Animal为父类,其余为子类

就多态性而言,我知道声明这一点是合法的:

Animal donkey = new Vertebrate();

但声明是非法的:

Invertebrate starfish = new Cat();

或者:

Spider red = new Invertebrate();

我主要关心的是:

如何识别合法与非法声明?

这样假设是否安全:虽然子级可以从父级继承,但父级不能从子级继承?

最佳答案

你是对的。

Invertebrate starfish = new Cat();

不允许,因为 Cat 没有实现 Invertebrate 类,并且它不是任何实现该类的后代。

Spider red = new Invertebrate();

不允许,因为 Invertebrate 不是 Spider 的后代。

您可以使用标准的“IS A”术语与现实世界进行类比来思考这一点。

蜘蛛无脊椎动物

无脊椎动物不是蜘蛛(有些无脊椎动物不是蜘蛛)。

不是无脊椎动物(不过,您可以将它们都放在一个盒子里)。

额外:

“将它们放在一个盒子里”演示了一个单独的概念,即接口(interface)。您可以创建接口(interface) Boxable,然后编辑 CatInvertebrate 类,以便它们实现该接口(interface)。 实现该接口(interface)的类之间不需要任何关系。这使您可以将类层次结构中的远亲类视为可互换的在有意义的情况下这样做

关于Java-多态性 : legal vs illegal declarations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838553/

相关文章:

c++ - 需要关于多重继承和可选函数覆盖 C++ 的建议

javascript:接收单选按钮组中的单选按钮值并根据每种情况命令不同的指令

Windows 2003 Server 中的 java.io.IOException key 大小太大

Java - 对象运行外部进程: how to stop it?

java - 安卓 : Is it possible to inherit from MainActivity class?

c++ - 如何覆盖多态性的运算符

java - Java 中的静态和动态绑定(bind)

java - 有没有办法设置 Jersey 资源返回的 ArrayList 的名称

java - 找不到符号符号 : constructor A() location: class A

javascript - 如何从 typescript 中的扩展类中排除接口(interface)属性