受教了,老师们好强

前今天在一本讲解javase6.0的书上看到了关于java程序加载的知识。现将原文拷贝如下:

java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。
提示:再次创建同类的对象时,类的加载不再进行,语句块(静态的)只执行一次,加载完成后不再执行,创建子类对象时上述过程要先走父类的,一直递归到java.lang.object类。
下面的例子说明了上述加载规则,代码如下:
public class MyClassFather {
public MyClassFather() {
   System.out.println("执行要创建对象类父类的构造器");
}
}

public class MyClass extends MyClassFather {
public MyClass() {
   System.out.println("执行要创建对象类的构造器");
}

Unstatic u = new Unstatic();
final UnstaticFinal uf = new UnstaticFinal();
{
   System.out.println("执行非静态语句块");
}
static {
   System.out.println("执行静态语句块");
}
static final StaticFinal sf = new StaticFinal();
static Static s = new Static();
}

public class StaticFinal {
public StaticFinal() {
   System.out.println("静态final的成员变量初始化");
}
}

public class Static {
public Static() {
   System.out.println("静态非final的成员变量初始化");
}
}

public class UnstaticFinal {
public UnstaticFinal() {
   System.out.println("非静态final的成员变量初始化");
}
}

public class Unstatic {
public Unstatic() {
   System.out.println("非静态非final的成员变量初始化");
}
}

public class Sample10_16 {
public static void main(String[] args) {
   new MyClass();
}
}

 运行结果如下:
执行静态语句块!!!
静态final的成员变量初始化!!!
静态非final的成员变量初始化!!!
执行要创建对象类父类的构造器!!!
非静态非final的成员变量初始化!!!
非静态final的成员变量初始化!!!
执行非静态语句块!!!
执行要创建对象类的构造器!!!

 

我现在不明白的是构造器不是最后才调用的吗?并且调用子类构造器是会首先调用父类的构造器,我认为的运行结果是:

执行静态语句块!!!
静态final的成员变量初始化!!!
静态非final的成员变量初始化!!!
非静态非final的成员变量初始化!!!
非静态final的成员变量初始化!!!
执行非静态语句块!!!

执行要创建对象类父类的构造器!!!
执行要创建对象类的构造器!!!

不知道自己哪里没搞明白,希望高手指点!

唐琳:你的问题很细致很好,其实这个代码的运行结果主要是两部分内容的表现:1.加载类  2.创建对象。从你的迷惑上来看问题出在2上面,说白了:创建对象是通过调用构造器完成的。
本身创建对象时就调用了子类的构造器,在继承的机制中是先调用了父类,完成其非静态的成员初始化执行其构造器,然后再执行子类非静态的成员初始化执行其构造器其它内容
(除了super()或this())的过程。
杨旭:唐老师,您的意思是不是:第三步中类加载完创建对象,因为创建对象要
通过执行构造器来完成,所以进入到子类的构造器中。因为编译器为无参数的子类
构造器自动加上super(),所以调用父类构造器。而执行父类构造器时会首先加载
非静态的成员。加载完后才打印出"执行要创建对象类父类的构造器!!!"这句话,
表示父类对象创建成功。然后同样的原理构造子类对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值