【问题标题】:Can a subclass also be a superclass?子类也可以是超类吗?
【发布时间】:2015-08-02 15:40:49
【问题描述】:

一个子类也可以是 Java 中另一个子类的超类吗?也许这不是最好的例子,但请考虑以下类:

public class Animal { }
public class Dog extends Animal { } 
public class Cat extends Animal { } 
public class Siamese extends Cat { }
public class JackRussel extends Dog { }

继承允许这种行为吗?

鉴于 JackRussels 需要 Animal 和 Dog 的方法和属性,而 Siamese 需要 Animal 和 Cat 的方法和属性。

如果没有,我可以采取一种通用的方法来实现这种行为吗?

干杯

【问题讨论】:

  • 这里的语言是Java。我认为这个问题与语言无关。我将在其中进行编辑。
  • 是的,Java 允许这样做。你为什么不自己尝试一下?
  • 是的,将Mammal 视为狗的超类,但将其视为Living 的子类
  • 你有代码,并且你想检查它是否有效......当然javac 是确定它而不是堆栈溢出的最佳方法。如果你不问它是否是有效的代码,你问的是什么
  • @Mackiavelli Errrm ...“这就是 java 使用接口来模拟多重继承的原因”。拥有接口的主要目的不是模拟多重继承。拥有接口有几个目的,其中之一是让类履行角色绑定到合同。也许你想表达接口是一种模拟多重继承的方式,但这不是它们存在的原因。

标签: java oop inheritance subclass superclass


【解决方案1】:

是的,这种行为正是在 Java 中使用继承时所期望的。 以下是一些可能对您有用的快速阅读:http://www.homeandlearn.co.uk/java/java_inheritance.html

您的 JackRussel 对象将继承其 Animal 和 Dog 超类的所有字段和方法:

  • 未声明为私有;
  • 未被覆盖(在这种情况下将只能访问覆盖);
  • 没有被遮蔽(在这种情况下将只能访问被遮蔽的);

这是另一个关于 Java 中的阴影和覆盖的快速链接: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_04.htm

考虑到这一点,您可以轻松设计继承树,将父级的行为和状态传播给其所有子级。

谢谢。

【讨论】:

  • 谢谢,对于 OOP 概念的新手非常有见地。
【解决方案2】:

这当然是可能的。但是说 Siamese 需要来自两个超类的方法和字段是有点错误的。当 cat 扩展动物时,它会获取动物的所有字段和方法(如果您不覆盖它们)。然后,当 Siamese 扩展该 cat 类时,它会自动获取整个 Cat 类,包括来自 Animal 类的东西,无论它们是否被覆盖。

简而言之,这是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2012-03-27
    相关资源
    最近更新 更多