不是这个意思。所谓“实例化子类的对象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。如果子类没有显式调用语句,编译器会隐式帮你加上。
如:
public class A
{
public A()
{
}
}
public class B extends A
{
public B()
{
}
}
等价于:
public class A
{
public A()
{
super();//这里实际上是Object();
//其他初始化工作
}
}
public class B extends A
{
public B()
{
super();//这里实际上是A();
//其他初始化工作
}
}
另外,如果有这种情况:
public class A
{
X x=new X();
public A()
{
}
}
public class B extends A
{
Y y=new Y();
public B()
{//这是类A空间里的字段都已经初始化完毕。
}
}
在成员y被赋值之前,x一定已经存在。换句话说,X x=new X();一定先于Y y=new Y();执行。
你要明白,new B()的实际是调用了构造方法。而子类的构造方法一定会调用父类的构造方法的。所以你在new B() 的时候,实际上同时也调用了父类的构造方法 new A()。
你可以理解为子类实际上是父类+扩展
实例化子类的时候 是先初始化父类再初始化扩展
public class A {
public A() {
System.out.println("初始化A..");
}
public static void main(String[] args) {
B a = new B();
}
}
class B extends A {
public B() {
System.out.println("初始化B..");
}
}
A a = new B(),只初始化了子类