方法重写和继承

时间:2015-08-16 19:59:03

标签: java inheritance override

PlaneCircle

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

当我创建PlaneCircle planeCircle1 = new PlaneCircle(3, 6, 7); System.out.println(planeCircle1.toString()); (在另一个java文件中)的实例时,如下面两行......

Class = PlaneCircle (radius = 3.0)

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

toString()

PlaneCircle中的super.toString()方法调用toString(),而Circle中的getClass().getSimpleName()方法应该提供" Circle"当我使用Log.d("DEBUG", "Some Text"); 时。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

getClass()也是多态的 - 它返回一个Class对象,表示它所属的实例,在本例中为PlaneCircle。如果您不想要此行为,则可以硬编码Circle

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

或静态访问Circle类:

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

答案 2 :(得分:0)

由于您正在In [8]: import numpy as np A = np.genfromtxt('your_file.dat') In [9]: print A[A[:,2]==3] [[ 1.5699 -10.23 3. ] [ 1.5978 -10.55 3. ] [ 1.2389 -9.71 3. ] [ 1.6536 -10.69 3. ] [ 1.4136 -9.77 3. ] [ 1.4086 -10.67 3. ] [ 1.5291 -10.66 3. ] [ 1.599 -10.62 3. ] [ 1.3901 -10.65 3. ]] In [10]: print A[A[:,2]==4] [[ 1.9541 -12.91 4. ] [ 1.7915 -12.54 4. ] [ 1.7548 -10.74 4. ] [ 1.8927 -10.8 4. ] [ 1.9223 -10.87 4. ] [ 1.9047 -11.77 4. ] [ 1.8488 -12.28 4. ] [ 1.7059 -11.41 4. ] [ 1.7834 -12.25 4. ] [ 1.8094 -10.99 4. ] [ 1.4622 -10.49 4. ] [ 1.9164 -12.58 4. ] [ 1.9464 -12.58 4. ] [ 1.644 -12.34 4. ] [ 1.8986 -12.27 4. ] [ 1.4316 -10.03 4. ] [ 1.8346 -11. 4. ]] 而不是PlaneCircle的实例上运行,因此Circle将在您当前的getClass.getSimpleName()实例上调用PlaneCircle。 使用当前设置,您可能无法使用多态行为打印“Circle”。在运行时,将调用PlaneCircle的方法。