请帮助我了解继承的工作原理。
如果我有两个班,父母和孩子。当我创建一个子实例时,是否构造了父类实例?
我的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
的实例。我是对的吗?
答案 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)
是。父对象和子对象都已创建。子类构造函数首先调用父(超)类构造函数,然后只执行子类的其他函数。从您自己的代码中可以看到两个不同的值被打印。