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 + ")";
}