为什么我不能将父类分配给子类类型的变量?

时间:2017-04-08 15:43:08

标签: java oop run-time-polymorphism

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

<script type="text/javascript" src="jquery.min.js"></script>

 <div id='container'>
    <div id='title'>
      <h1>Learning Js Properly: Project #1 - Dynamic Quiz</h1>
    </div>
    <br/>
    <div id='quiz'></div>
    <div class='button' id='next'><a href='#'>Next</a></div>
    <div class='button' id='prev'><a href='#'>Prev</a></div>
    <div class='button' id='start'> <a href='#'>Start Over</a></div>
    <!-- <button class='' id='next'>Next</a></button>
            <button class='' id='prev'>Prev</a></button>
            <button class='' id='start'> Start Over</a></button> -->
  </div>

然而,我们可以反过来 请回答内存视图(堆)

2 个答案:

答案 0 :(得分:2)

没有理由与记忆有关。它更简单。子类可以通过添加新方法来扩展其超类的行为。虽然没有给出,但超类具有其子类的所有方法。请看以下示例:

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()。所以你可以节省地调用这个方法。

答案 1 :(得分:-1)

答案为时已晚。

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

// 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”类对象。所以编译器抛出异常。