我有抽象类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方法,但是它是如何工作的?
谢谢。
答案 0 :(得分:0)
这就是多态和继承的工作方式。如果你要编写面向对象的代码,那么理解它是很重要的。
最简单的解释是假设有一个方法表说“我知道我在编译时是一个抽象类,但在运行时我知道我是一个具体的子类。查看孩子的版本方法表中的那个方法并调用它。“在运行时有一定程度的间接性。
答案 1 :(得分:0)
您在测试中实例化Circle类。
那么您的Circle实例中发生了什么:
请注意,您没有实例化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