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的实例(在另一个Java文件中)时,如以下两行所示...

PlaneCircle planeCircle1 = new PlaneCircle(3, 6, 7);
System.out.println(planeCircle1.toString());


我在控制台输出中得到的是

Class = PlaneCircle (radius = 3.0)


toString()中的PlaneCircle方法调用super.toString(),而当我使用toString()时,Circle中的getClass().getSimpleName()方法应给出“ Circle”。

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

最佳答案

planeCircle1PlaneCircle的实例,这意味着getClass()将返回PlaneCircle.class(即表示Class类的PlaneCircle实例),而getClass().getSimpleName()将返回该类的名称-“ PlaneCircle”。

不必从基类getClass().getSimpleName()的方法中调用Circle,因为当您调用不带实例变量的方法时,您是在当前实例上调用它(即getClass()this.getClass(),并且this是代码示例中PlaneCircle的实例)。

10-07 16:58