[英]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实例中发生了什么:
请注意,您没有实例化一个Shape而是一个圆。 然后,关键部分是真正了解方法重写在OO中的工作方式:calc()方法实际上只是指向实际实现的虚拟指针。 由于您正在实例化一个Circle,因此它将指向Circle类中的重写实现。
想象它是对this.calc()
的调用。 它不会调用相同类的方法计算 ,它调用这个方法计算 , 这是一个Circle对象。
乔恩·斯卡特(Jon Skit)和艾亚尔·施耐德(Eyal Schneider)在以下帖子中的答案可能是该问题的答案-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.