6

假设我创建了一个对象,并且运行了一个父类的构造函数。使用此构造函数,是否还会在幕后创建父对象的新对象?

如果没有,private父类的字段存储在哪里?您实际上可以调用super对调用对象不可见的私有字段进行操作的父对象(带有或不带有 )的任何方法。

如果有最熟悉 Java 内存模型的人,非常欢迎他或她的回答!

4

3 回答 3

10

使用此构造函数,是否还会在幕后创建父对象的新对象?

不,只创建一个实例。创建的实例包含当前类及其所有超类的属性。

如果没有,父类的私有字段存储在哪里?

像所有类属性一样,它们存储在堆上。如果它们是在当前类或超类中定义的,则它们在内存位置方面没有区别。

于 2013-10-11T08:51:47.177 回答
0

请记住,继承是基类和子类之间的“是”关系,因此每次您拥有一个子类的实例时,根据定义,您也将拥有一个基类的实例(作为实例的一部分,而不是作为两个单独的实例)。为了正确初始化基类,调用构造函数。

于 2013-10-11T08:57:18.960 回答
0

它不创建两个对象,只创建子类对象。

从另一个类继承时,必须在构造函数中调用 super()。如果您不这样做,编译器将为您插入该调用,您可以清楚地看到。

调用超类构造函数是因为否则对象将处于未初始化状态。

于 2013-10-11T08:56:19.597 回答