使用此代码:
class SuperTest {
SuperTest() { whoAmI(); }
void whoAmI() { System.out.println(getClass().getName()); }
}
class Test extends SuperTest {
Test() { whoAmI(); }
}
new Test()
将打印"Test"
两次。作为初学者,我期待输出为"SuperTest / Test"
。我现在明白为什么这是不可能的,以及为什么隐式this
只会引用子类型。
但是我无法找到whoAmI()
实际打印输出SuperTest / Test
的内容。
换句话说:whoAmI()
如何访问它的类型名称"从"中调用?
编辑:我正在更改问题的标题,以便更好地描述问题。 (旧的是:继承:是否有一个"这个等价的"构造来引用派生类型的超类型。)
答案 0 :(得分:5)
这是预期的行为,因为在两种情况下getType()
都在Test
类型的同一对象上调用。这是因为JVM知道正在创建的对象的类型是在调用基本构造函数时派生类Test
,因此这是要打印的类型。
这种行为并非对所有编程语言都是通用的,但它在Java中以这种方式工作。
如果某个类想要访问自己的Class
对象,则可以静态,即使用SuperTest.class
表达式。
要获得您想要的行为,您可以将类从构造函数传递给whoAmI
,如下所示:
class SuperTest {
SuperTest() { whoAmI(SuperTest.class); }
void whoAmI(Class c) { System.out.println(c.getName()); }
}
class Test extends SuperTest {
Test() { whoAmI(Test.class); }
}
答案 1 :(得分:0)
为了您的娱乐,这是一个测试程序,展示了一个" whoAmI"将打印到任何所需的祖先深度:
public class Test {
public static void main(String[] args) {
Sub2 sub2 = new Sub2();
System.out.println("Four levels");
sub2.whoAmi(4);
System.out.println("Two levels");
sub2.whoAmi(2);
}
public void whoAmi(int levels){
if(levels > 1){
Class<? extends Object> ancestor = getClass();
for(int i=1; i<levels && ancestor != null; i++){
ancestor = ancestor.getSuperclass();
}
if(ancestor != null){
System.out.println(ancestor.getName());
}
whoAmi(levels - 1);
} else {
System.out.println(getClass().getName());
}
}
}
class Sub1 extends Test {
}
class Sub2 extends Sub1 {
}