那请你按照在内存中开辟时间顺序,详细的告诉我父类与子类的非静态变量和构造方法内存开辟和释放的顺序
时间: 2023-05-28 20:04:33 浏览: 43
在内存中开辟时间顺序:
1. 开辟父类的非静态变量内存
2. 执行父类的构造方法,初始化父类的非静态变量
3. 开辟子类的非静态变量内存
4. 执行子类的构造方法,初始化子类的非静态变量
内存释放顺序:
1. 先释放子类的非静态变量内存
2. 执行子类的析构方法,释放子类的非静态变量内存
3. 释放父类的非静态变量内存
4. 执行父类的析构方法,释放父类的非静态变量内存
需要注意的是,静态变量和静态方法是在类加载时就已经被加载到内存中,不随对象的创建而创建,因此它们的内存开辟和释放顺序与对象的非静态变量和构造方法无关。
相关问题
父类子类显示初始化和构造方法的加载顺序
在Java中,父类子类的对象初始化过程如下:
1. 首先,加载父类的静态初始化块。
2. 然后,加载子类的静态初始化块。
3. 接着,分别加载父类和子类的实例变量和实例初始化块。
4. 最后,加载父类和子类的构造方法。
总结起来,父类子类显示初始化和构造方法的加载顺序是:父类静态初始化块->子类静态初始化块->父类实例变量和实例初始化块->父类构造方法->子类实例变量和实例初始化块->子类构造方法。
但是super语句在子类构造器方法中,那为什么不是子类构造方法先被开辟,然后执行到super语句才会开辟父类构造方法的内存空间
在Java中,构造方法的执行顺序是先执行父类的构造方法,再执行子类的构造方法。这是因为子类构造方法中的第一条语句必须是调用父类的构造方法,否则会报编译错误。因此,当创建子类对象时,首先需要创建父类对象,然后才能创建子类对象。
当子类的构造方法调用super语句时,它实际上是在调用父类的构造方法,而不是在开辟父类构造方法的内存空间。因此,父类的构造方法会在子类的构造方法内部被执行,只不过执行的时机是在子类构造方法之前。这样就保证了父类的初始化先于子类的初始化,确保了正确的继承关系和属性的初始化。