java在创建子类对象时 用构造器对父类初始化了 这时候在内存中 子类和父类是两个空间吗 子类的属性和父类的属性内存是咋样的
时间: 2023-03-29 15:00:40 浏览: 68
在内存中,子类和父类是两个不同的空间,但是子类的属性和父类的属性是共享同一块内存空间的。子类对象在创建时,会先调用父类的构造器进行初始化,然后再对子类的属性进行初始化。因此,子类对象中包含了父类对象的所有属性和方法,同时还有自己的属性和方法。
相关问题
子类的构造器需要在开头调用父类的构造器,给个java例子
当我们创建一个子类时,需要在子类的构造器中调用父类的构造器以完成父类的初始化。在 Java 中,可以使用 super() 方法来调用父类的构造器。
以下是一个简单的例子:
```java
public class ParentClass {
private int num;
public ParentClass(int num) {
this.num = num;
}
}
public class ChildClass extends ParentClass {
private String name;
public ChildClass(int num, String name) {
super(num); // 调用父类的构造器
this.name = name;
}
}
```
在上面的例子中,ChildClass 继承自 ParentClass,ChildClass 的构造器中调用了父类的构造器 super(num),以完成 ParentClass 的初始化。
但是super语句在子类构造器方法中,那为什么不是子类构造方法先被开辟,然后执行到super语句才会开辟父类构造方法的内存空间
在Java中,构造方法的执行顺序是先执行父类的构造方法,再执行子类的构造方法。这是因为子类构造方法中的第一条语句必须是调用父类的构造方法,否则会报编译错误。因此,当创建子类对象时,首先需要创建父类对象,然后才能创建子类对象。
当子类的构造方法调用super语句时,它实际上是在调用父类的构造方法,而不是在开辟父类构造方法的内存空间。因此,父类的构造方法会在子类的构造方法内部被执行,只不过执行的时机是在子类构造方法之前。这样就保证了父类的初始化先于子类的初始化,确保了正确的继承关系和属性的初始化。