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)?这与反射有关吗?
答案 0 :(得分:4)
planeCircle1
是PlaneCircle
的一个实例,这意味着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的方法。