与子类和超类混淆

时间:2014-08-04 09:05:49

标签: java inheritance

Master test = new Inner();
System.out.println(test.getClass());

在上面的例子中,Inner类扩展了Master类,但我感到困惑的是test.getClass()返回Inner,但是不是真的测试Master类型吗?除了构造函数之外,Inner类中不能使用任何方法/属性,只能使用Master类中的方法/属性。此外,Inner的构造函数实际上设置了Inner独有的属性,但是这些属性在测试中不存在,即使它使用构造函数 - 它似乎不应该工作。

例如,如果将类定义为:

public class Master {
    public int number = 0;
    public Master() {
        number = 9;
    }
}

public class Inner extends Master {
    public int innerNumber = 0;
    public Inner() {
        number = 1;
        innerNumber = 2;
    }
}

test将使用Inner的构造函数来设置innerNumber,但test.innerNumber甚至不存在,因为innerNumber不是Master类型的一部分。另外,test.getClass()表示它是Inner类型,而不是Master。

2 个答案:

答案 0 :(得分:3)

Object.getClass()返回对象的 dynamic 类型的类对象,而不是静态类型(您声明它的变量或属性的类型)。

因此new Inner().getClass()会返回Inner.classnew Master().getClass()会返回Master.class,无论保存引用的变量类型是什么。

答案 1 :(得分:0)

问题1:

Master test = new Inner();

上面一行表示get方法实现来自Inner类( ovveriding )。所以内部类getClass()方法调用。

问题2:

test.innerNumber 

继承发生在Parent到Child之间。 innerNumberInner(孩子)的属性。 Master(家长)不会得到它。