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”?这与反射有关吗?
最佳答案
planeCircle1
是PlaneCircle
的实例,这意味着getClass()
将返回PlaneCircle.class
(即表示Class
类的PlaneCircle
实例),而getClass().getSimpleName()
将返回该类的名称-“ PlaneCircle”。
不必从基类getClass().getSimpleName()
的方法中调用Circle
,因为当您调用不带实例变量的方法时,您是在当前实例上调用它(即getClass()
与this.getClass()
,并且this
是代码示例中PlaneCircle
的实例)。