【发布时间】:2016-08-20 07:25:33
【问题描述】:
我有抽象类 Shape 如下,其中包含抽象方法 calc -
public abstract class Shape{
public Shape(){
System.out.println("from shape");
calc();
}
public abstract void calc();
}
另一个类 Circle 扩展了 Shape -
public class Circle extends Shape{
public Circle(){
System.out.println("from Circle");
}
public void calc(){
System.out.println("from calc in circle");
}
}
现在是 Final 主类-
public class BasicsTest{
public static void main(String [] args){
Cirlce c=new Circle();
}
}
运行主类时的输出 -
从形状
从圆圈中计算
来自圈子
我知道当我们创建子类的对象时,会调用父类的构造函数。我很困惑的是在 shape 的构造函数中调用 calc 方法是如何工作的,因为我们没有 shape 类中的 calc 实现。
public Shape(){
System.out.println("from shape");
calc(); // how the method from child class is being called ??
}
从输出看来,它似乎是从子类 circle 调用覆盖的 calc 方法,但它是如何工作的?
谢谢。
【问题讨论】:
-
@KrishnanunniPV 的评论比当前的一组答案更重要。尽管您可以调用该方法——您将调用尚未初始化的子类中的方法。最好避免这种情况。另见stackoverflow.com/questions/15327417/…。
-
在构造函数中添加很多功能也是一个坏主意,请参阅misko.hevery.com/code-reviewers-guide/…
-
感谢 Guyz 的参考
-
构造函数内部的一个可覆盖是疯狂的,因为在基类构造函数中调用子方法,当子类构造仍未完成时,请参阅stackoverflow.com/a/36553063/984823 - 你的麻烦感确实是对。