抽象方法在其类的构造函数中调用

时间:2016-04-26 12:46:12

标签: java class abstract

我有抽象类Shape,如下所示,其中包含abstarct方法calc -

public abstract class Shape{
   public Shape(){
       System.out.println("from shape");
       calc();
   }

public abstract void calc();
}

另一个扩展Shape的类Circle -

public class Circle extends Shape{
 public Circle(){
    System.out.println("from Circle");
 }
     public void calc(){
        System.out.println("from calc in circle");
     }
}

现在是最后的主要课程 -

public class BasicsTest{
   public static void main(String [] args){
      Cirlce c=new Circle();
   }
}

运行主类时的输出 -

从形状

来自圈中的计算

来自圈子

我明白当我们创建子类的对象时,将调用父类的构造。令我困惑的是,在形状的构造函数中对calc方法的调用是如何工作的,因为我们没有为形状类中的calc实现任何实现。

      public Shape(){
       System.out.println("from shape");
       calc();  // how the method from child class is being called ??
   }

从输出看起来它似乎是从子类圈调用重写的calc方法,但是它是如何工作的?

谢谢。

4 个答案:

答案 0 :(得分:0)

这就是多态和继承的工作方式。如果你要编写面向对象的代码,那么理解它是很重要的。

最简单的解释是假设有一个方法表说“我知道我在编译时是一个抽象类,但在运行时我知道我是一个具体的子类。查看孩子的版本方法表中的那个方法并调用它。“在运行时有一定程度的间接性。

答案 1 :(得分:0)

您在测试中实例化Circle类。

那么您的Circle实例中发生了什么:

  • 称为圆形构造函数
  • 超级构造函数被称为
  • 超级构造函数调用calc()方法
  • 您的Circle(!)实例的calc()方法称为

请注意,您没有实例化Shape但只是圆圈。那么关键部分就是真正理解方法覆盖在OO中是如何工作的:calc()方法实际上只是指向实际实现的虚拟指针。 由于您要实例化Circle,这将指向Circle类中的重写实现

答案 2 :(得分:0)

想象一下它是对this.calc()的调用。它不调用同一个类的方法 calc ,它调用 this 的方法 calc ,并且 this 是一个Circle对象。

答案 3 :(得分:0)

Jon skit和Eyal Schneider的回答来自以下帖子可能是这个问题的可能答案 -

State of Derived class object when Base class constructor calls overridden method in Java