【问题标题】:why subclass reference can't hold superclass object in java为什么子类引用不能在java中保存超类对象
【发布时间】:2015-08-27 10:58:11
【问题描述】:
class One{

}
class Two extends One{

}
class Main{

      public static void main(String[]  args){
       Two t = new One(); // invalid 

}`
}

我无法理解背后的原因,为什么子类引用不能持有父类的对象,而超类引用可以持有子类的对象。

【问题讨论】:

  • 因为超类的实例不是(必然)子类的实例。例如,Parrot 是 Animal,但并非每个 Animal 都是 Parrot。
  • 哦..明白了,谢谢

标签: java


【解决方案1】:

因为狗具有动物的所有行为,但只知道是动物的东西并不能保证具有狗的所有行为。

【讨论】:

    【解决方案2】:

    每个孩子都是父母,但不是每个父母都是孩子。继承规则。

    【讨论】:

      【解决方案3】:

      TWO 的类型不能是 ONE 的实例,因为有些成员和方法是 TWO 具有而 ONE 没有的。但是,ONE 的类型可以引用 TWO,因为 TWO 拥有 ONE 所拥有的一切。

      例如,如果 ONE 可以 WALK,TWO 也可以 RUN,那么如果您有 ONE 类型的对象,则需要能够 WALK。因此,如果 ONE 引用了 TWO,因为 TWO 可以行走。

      但是当你有一个类型为 TWO 的对象时,它需要能够运行,所以你不能将它引用到不能运行的 ONE。

      【讨论】:

        【解决方案4】:

        如果我们从集合论的角度来看,与父类相比,子类是一个超集。 与父类相比,子类具有所有可能的属性和方法。

        因此,父类对象可以引用其子类对象,因为子类对象包括父类的方法和属性。 反之亦然,由于父类对象不具备子类所需的所有方法和属性,因此子类对象不能引用父类对象。

        【讨论】:

          【解决方案5】:

          考虑类 2 包含一个方法,比如说 demo()。

          class One{
          
          }
          
          class Two extends One {
               void demo(){
                   System.out.println("in Two");
               }
          }
          
          class Main{
          
                public static void main(String[]  args){
                   Two t = new One(); // Suppose this is valid at compilation time
                   t.demo();
                }
          
          }
          

          现在假设当我们创建类 One 的对象时编译器没有给我们错误,即子引用包含父对象。进一步的 t 是类二的引用,因此 t.demo() 是有效的。

          现在当程序运行时,引用 t 包含类 One 的对象。当程序到达 t.demo() 时,t 包含类 One 的对象,而类 One 没有任何名为 demo() 的方法。

          因此,为了防止此类错误,编译器会检查对象是否为引用类型,即对象类与引用类或引用类的子类相同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-16
            相关资源
            最近更新 更多