假设我创建了一个对象,并且运行了一个父类的构造函数。使用此构造函数,是否还会在幕后创建父对象的新对象?
如果没有,private
父类的字段存储在哪里?您实际上可以调用super
对调用对象不可见的私有字段进行操作的父对象(带有或不带有 )的任何方法。
如果有最熟悉 Java 内存模型的人,非常欢迎他或她的回答!
假设我创建了一个对象,并且运行了一个父类的构造函数。使用此构造函数,是否还会在幕后创建父对象的新对象?
如果没有,private
父类的字段存储在哪里?您实际上可以调用super
对调用对象不可见的私有字段进行操作的父对象(带有或不带有 )的任何方法。
如果有最熟悉 Java 内存模型的人,非常欢迎他或她的回答!
使用此构造函数,是否还会在幕后创建父对象的新对象?
不,只创建一个实例。创建的实例包含当前类及其所有超类的属性。
如果没有,父类的私有字段存储在哪里?
像所有类属性一样,它们存储在堆上。如果它们是在当前类或超类中定义的,则它们在内存位置方面没有区别。
请记住,继承是基类和子类之间的“是”关系,因此每次您拥有一个子类的实例时,根据定义,您也将拥有一个基类的实例(作为实例的一部分,而不是作为两个单独的实例)。为了正确初始化基类,调用构造函数。
它不创建两个对象,只创建子类对象。
从另一个类继承时,必须在构造函数中调用 super()。如果您不这样做,编译器将为您插入该调用,您可以清楚地看到。
调用超类构造函数是因为否则对象将处于未初始化状态。