静态代码块与类的加载过程

笔试过程中经常遇到静态代码块与类的加载过程的选择题:

代码块的特点:随着类的加载而加载;优先于对象存在;修饰的成员被所有对象共享;访问权限允许时,可不创建对象,直接被类调用。静态代码块中只能调用静态属性或者静态方法;非静态代码块可以调用静态与非静态的属性或方法。

代码块的作用:对java类或对象进行初始化。

非静态代码块:随着对象的创建而执行;每创建一次对象,都会执行一次,且优先于构造器执行

静态代码块:随着对象的创建而执行,随着类的加载而执行且只被加载一次;静态代码块的执行先于非静态代码块;

如题:

 

 输出为:

 

 分析:当程序进入主函数,进行到第三行代码时,一个new说明要创建一个对象,然后跳入 static Demo d1=new Demo()这行代码,由于这里又new一个对象,因此又进入Demo类,由于d1是静态对象,已经储存在方法区中,所以进入代码块输出line1,然后执行静态代码块输出Line2,然后回去对d2继续执行,由于静态代码块只执行一次,因此又输出lin1。这里有一个问题,为什么new d1的时候先执行的代码块然后再执行的静态代码块。

 

对于这个代码执行new classLoader();这个指令,就很明显的可以体现,先执行静态,然后代码块,然后构造器。

 

posted @ 2022-03-23 10:48  ganrui~~~  阅读(377)  评论(0)    收藏  举报