Java 方法重写和继承

Java 方法重写和继承,java,inheritance,overriding,Java,Inheritance,Overriding,假设上述两个类位于不同的文件中 当我创建PlaneCircle(在另一个java文件中)的实例时,如下面两行所示 public class Circle { public static final double PI = 3.141592654; protected double radius; public Circle(double radius) { this.radius = radius; } @Override p

假设上述两个类位于不同的文件中

当我创建
PlaneCircle
(在另一个java文件中)的实例时,如下面两行所示

public class Circle {

    public static final double PI = 3.141592654;
    protected double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public String toString() {
        return "Class = " + getClass().getSimpleName() + " (radius = " + radius + ")";
    }
}


public class PlaneCircle extends Circle {

    private double centerX, centerY;

    public PlaneCircle(double radius, double centerX, double centerY) {
        super(radius);
        this.centerX = centerX;
        this.centerY = centerY;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}
我在控制台输出中得到的是

PlaneCircle planeCircle1 = new PlaneCircle(3, 6, 7);
System.out.println(planeCircle1.toString());
PlaneCircle
中的
toString()
方法调用
super.toString()
,而
Circle
中的
toString()
方法在我使用
getClass().getSimpleName()
时应该给出“Circle”


我的问题是,为什么在这种情况下,即使我已经创建了子类(PlaneCircle)的实例,输出仍然是“PlaneCircle”而不是“Circle”?这与反射有什么关系吗?

planeCircle1
PlaneCircle
的一个实例,这意味着
getClass()
将返回
PlaneCircle.class
(即表示
PlaneCircle
类的
class
实例)和
getClass().getSimpleName()
将返回该类的名称-“PlaneCircle”

从基类的方法调用
getClass().getSimpleName()
并不重要,因为当您调用没有实例变量的方法时,您是在当前实例上调用它(即
getClass()
this.getClass()相同)
,而
是您的代码示例中的
PlaneCircle
的一个实例。

getClass()
也是多态的-它返回一个
对象,该对象表示它所属的实例,在本例中为
PlaneCircle
。如果您不希望出现这种行为,可以硬编码
循环

Class = PlaneCircle (radius = 3.0)
或静态访问
圆圈
类:

@Override
public String toString() {
    return "Class = circle (radius = " + radius + ")";
}

由于您操作的是
PlaneCircle
的实例,而不是
Circle
,因此
getClass.getSimpleName()
将在当前
PlaneCircle
的实例上调用。
使用当前设置,您可能无法使用多态行为打印“圆圈”。在运行时,将调用PlaneCircle的方法。

调用该方法的对象很重要。在这种情况下,对象是PlainCircle,您将在ToString中获得PlanCircle常量PI已在
Math
类中定义。看,你测试代码了吗?我这边的代码仍然显示相同的结果。
@Override
public String toString() {
    return "Class = " + Circle.class.getSimpleName() + " (radius = " + radius + ")";
}