繁体   English   中英

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

[英]Abstract Method called in its class's constructor

我有下面的抽象类Shape,其中包含abstarct方法calc-

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

public abstract void calc();
}

延伸形状的另一类圆-

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

从圈子

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

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

从输出看来,它正在从子类圈子中调用重写的calc方法,但它如何工作?

谢谢。

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

最简单的解释是,假设有一个方法表,其中说:“我知道我在编译时是一个抽象类,但是在运行时,我知道我是一个具体的子类。请在下面的方法中查找该方法的子版本。方法表并调用它。” 在运行时会进行一定程度的间接访问。

您可以在测试中实例化Circle类。

因此,您的Circle实例中发生了什么:

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

请注意,您没有实例化一个Shape而是一个圆。 然后,关键部分是真正了解方法重写在OO中的工作方式:calc()方法实际上只是指向实际实现的虚拟指针。 由于您正在实例化一个Circle,因此它将指向Circle类中的重写实现。

想象它是对this.calc()的调用。 它不会调用相同类的方法计算 ,它调用这个方法计算是一个Circle对象。

乔恩·斯卡特(Jon Skit)和艾亚尔·施耐德(Eyal Schneider)在以下帖子中的答案可能是该问题的答案-

基类构造函数在Java中调用重写方法时派生类对象的状态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM