【问题标题】:Java: Superclass and subclassJava:超类和子类
【发布时间】:2011-02-03 10:27:17
【问题描述】:
  1. 可以将子类变量强制转换为它的任何超类吗?
  2. 可以为超类变量分配任何子类变量吗?
  3. 可以为超类分配任何变量吗?
  4. 如果可以,是否可以为接口变量分配来自任何实现类的变量?

【问题讨论】:

  • 您应该清楚地区分变量和值的概念。就像现在一样,您的问题非常令人困惑。
  • 您可能需要阅读有关反/协方差的内容,因为如果您稍微改变您的问题,答案就会改变。通过阅读以下内容,您可以大致了解不同的答案:stackoverflow.com/questions/1184295/java-covariance-question

标签: java variables subclass superclass class-hierarchy


【解决方案1】:

所有的狗都是动物吗?

所有的动物都是狗吗?

如果你需要一只动物,而我给你一只狗,那总是可以接受的吗?

如果你特别需要一只狗,但我给你任何动物,那会不会有问题?

如果您需要可以驾驶的东西,但您不在乎它是什么,只要它具有 .Accelerate 和 .Steer 之类的方法,您会关心它是保时捷还是救护车?

【讨论】:

    【解决方案2】:
    • 是的
    • 您可以将子类实例分配给超类变量
    • 嗯?
    • 您可以将一个类的实例分配给该类实现的任何接口类型的变量

    【讨论】:

    • 我认为不能为超类分配任何变量,只能是兼容类型之一。
    • 第二个问题是superclass 实例是否可以分配给subclass 变量,答案肯定是no.
    • @Mark:问题不清楚。我乐观地选择了有肯定答案的解释。
    【解决方案3】:

    为了清楚起见,请考虑:

    class A extends B implements C {  }
    

    A 是子类,B 是超类,CA 实现的接口。

    1. 子类可以向上转换为任何超类。

      B b = new A();
      
    2. 超类不能向下转换为任何子类(这是不合理的,因为子类可能具有超类没有的功能)。你不能这样做:

      A a = new B(); // invalid!
      
    3. 超类可以分配给任何适当类型的变量。

      A q = new A(); // sure, any variable q or otherwise...
      
    4. 一个类可以被分配给一个其实现接口类型的变量。

      C c = new A();
      

    【讨论】:

      【解决方案4】:

      子类变量可以转换为任何 它的超类?

      是的

      超类变量可以是 分配了任何子类变量?

      是的

      可以为超类分配任何 变量?

      是的

      如果是这样,接口变量可以是 从任何分配一个变量 实现类?

      是的

      【讨论】:

      • 您不能将超类实例分配给子类变量。
      • @Mark 也许我误解了这个问题。它不是说“为超类变量分配子类变量”吗?例如数组列表 myArrayList = ... ;列出 myList = myArrayList
      【解决方案5】:

      是的,这通常是 polymorphism 的主要思想。

      假设您有一些形状:圆形、方形、三角形。你会有:

      class Shape { ... }
      
      class Circle extends Shape { ... }
      
      class Square extends Shape { ... }
      
      class Triangle extends Shape { ... }
      

      继承的思想是圆是一个形状。所以你可以这样做:

      Shape x = ...;
      Point p = x.getCenterPosition();
      

      您无需关心x 变量是哪种具体类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2017-10-16
        • 2014-03-23
        • 1970-01-01
        相关资源
        最近更新 更多