继承:有没有办法发现一个方法被调用的类?

时间:2014-07-19 23:45:08

标签: java inheritance this

使用此代码:

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()如何访问它的类型名称"从"中调用?

编辑:我正在更改问题的标题,以便更好地描述问题。 (旧的是:继承:是否有一个"这个等价的"构造来引用派生类型的超类型。)

2 个答案:

答案 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 {
}