遗产如何运作?

时间:2014-08-22 11:30:09

标签: java inheritance

请帮助我了解继承的工作原理。

如果我有两个班,父母和孩子。当我创建一个子实例时,是否构造了父类实例?

我的Parent类代码。

public class Parent {
    private char s;

    @Override
    public int hashCode() {
        return s;
    }
}

Child

public class Child extends Parent {
    private int i;

    public Child(int i) {
        super();
        this.i = i;
    }

    @Override
    public int hashCode() {
        return i;
    }
}

最后是测试

public class Main {
    public static void main(String[] args) {
        Child child = new Child(100);
        System.out.println(child.hashCode());
        System.out.println(child.getClass().getSuperclass().hashCode());
    }
}

在输出中我得到了

100
2000502626

所以对象的哈希值是不同的。这意味着当我创建Child的实例时,它也会创建Parent的实例。我是对的吗?

5 个答案:

答案 0 :(得分:10)

你的问题与继承无关。

您从100实例的child方法获得的hashcode(),如您所料。

2000502626来自Parent.class,而非Parent object

Parent.class的类型为java.lang.Class

parent object的类型为Parent

答案 1 :(得分:3)

当您创建Child对象时,也会调用Parent构造函数,因为Child Parent。

但是当你这样做时:

System.out.println(child.getClass().getSuperclass().hashCode());

您没有调用Parents实例hashode 您正在调用Class对象实例的hashCode()。 查看child.getClass().getSuperclass()返回的内容。它返回类型为Class的实例,而不是类型为Parent / Child的实例。 您不能使用child.getClass()调用Parents实例方法.getSuperClass() - 不返回类型的实例,而是返回表示此类型的对象。

尝试在子方法中执行此操作:

@Override
public int hashCode() {
    System.out.println("In child hashCode: " + i);
    System.out.println("Parents hashCode: " + super.hashCode());
    return i;
}

这将返回100和0,因为Parents s尚未初始化。

答案 2 :(得分:1)

实际上,只会创建一个子对象。由于每个子节点都是父节点,因此将调用父节点构造函数。如果在子实例和父实例方法中都打印this,它将打印相同的(子对象) 检查 - this question

答案 3 :(得分:0)

  

如果我有两个类,父和子,当我创建一个子实例时,是否也构造了父类实例?

是。它通过构造函数工作。当您调用子类的构造函数来创建对象时,它首先调用其父类构造函数,从而创建父类的对象

答案 4 :(得分:-1)

是。父对象和子对象都已创建。子类构造函数首先调用父(超)类构造函数,然后只执行子类的其他函数。从您自己的代码中可以看到两个不同的值被打印。