【问题标题】:Why can't I assign a parent class to a variable of subclass type?为什么我不能将父类分配给子类类型的变量?
【发布时间】:2017-04-08 15:43:07
【问题描述】:

为什么子类的引用变量不能指向父类的对象?即

Child obj = new Parent();

但是我们可以反之亦然 请用内存视图(堆)回答

【问题讨论】:

  • 这和内存无关。
  • 对象类型之间存在层次关系。每个Dog 都是Animal,但不是每个Animal 都是Dog

标签: java oop run-time-polymorphism


【解决方案1】:

没有任何理由与记忆有关。这要简单得多。子类可以通过添加新方法来扩展其超类的行为。虽然没有给出,但超类具有其子类的所有方法。举个例子:

public class Parent {
    public void parentMethod() {}
}

public class Child extends Parent {
    public void childMethod() {}
}

现在让我们考虑一下,如果您可以将Parent 的实例分配给Child 类型的变量会发生什么。

Child c = new Parent(); //compiler error

由于c 的类型为Child,因此允许调用方法childMethod()。但是由于它确实是一个Parent 实例,它没有这个方法,这会导致编译器或运行时问题(取决于检查完成的时间)。

反过来也没问题,因为你不能通过扩展类来删除方法。

Parent p = new Child(); //allowed

ChildParent 的子类,因此继承了parentMethod()。所以你可以节省地调用这个方法。

【讨论】:

    【解决方案2】:

    答案为时已晚。

    我相信我们可以用记忆来解释它。也许我错了,但这就是我对这种情况的想法。

    // Assume, Required 2KB for execution
    public class Parent {
        public void display(){      
            System.out.println("From Parent");
        }
    }
    
    // Total memory required for execution : 4bk
    public class Child extends Parent {
        @Override
        public void display() {     
            super.display(); // 2KB
        }
        
        public void sayHello() {     
            System.out.println("From Child - Hello"); // 2KB
        }
    }
    
    
    
       //2KB expect    //4KB assigned
         Parent parent = new Child();
            
       //4KB expect    //Only 2KB is assigning
         Child child = new Parent();
    

    这里的 'CHILD' 类变量需要 4KB 内存,但我们正在尝试为其分配 2KB 的 'Parent' 类对象。所以编译器抛出异常。

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      相关资源
      最近更新 更多