“this.getClass()。getSuperclass()”的意外输出

时间:2015-05-13 14:27:01

标签: java inheritance superclass

考虑以下两种情况

案例I

我有一个简单的Java类,它有一个无参数的构造函数。以下是代码

public class TestClassOne {

      public TestClassOne() {
           System.out.println("Parent class of TestClassOne is :" + this.getClass().getSuperclass());
    }
}

Object是所有Java类的超类。因此,当我在main方法中创建一个TestClassOne对象并运行它时,它给了我欲望输出,这是

Parent class of TestClassOne is :class java.lang.Object

案例II

现在我有另一个名为TestClassTwo的类,它扩展了TestClassOne。以下是代码

public class TestClassTwo extends TestClassOne {
}

现在,当我在main方法中创建TestClassTwo的对象并运行它时, TestClassOne的无参数构造函数也被隐式调用,因为TestClassOne是TestClassTwo的超类并在控制台中打印输出。我期待输出与情况I相同。但事实并非如此。输出是

Parent class of TestClassOne is :class org.test.TestClassOne

为什么以上输出与Case I相同?

有人可以解释一下为什么案例I和案例II中的输出有所不同吗?

2 个答案:

答案 0 :(得分:1)

您在getClass()上致电this。输出不同,因为:

  • 在案例1中,this指的是TestClassOne
  • 的实例
  • 在案例2中,this指的是TestClassTwo
  • 的实例

答案 1 :(得分:0)

简单回答:因为这是超类。

public class TestClassOne {
    public TestClassOne() {
        System.out.println("Parent class of TestClassOne is :" + this.getClass().getSuperclass());
    }
}

此类extends java.lang.Object(即使未明确命名)。

所以this引用类TestClassOne的对象,超类是java.lang.Object

public class TestClassTwo extends TestClassOne {
}

此课程extends TestClassOne

所以this引用类TestClassTwo的对象,超类是TestClassOne

对于this,始终使用当前的对象,而不是使用它的类。