Java基础: 静态与动态代码块

定义:在定义属性的位置上,在任何方法之外,定义一个代码块  

种类:分为两类即动态代码块、静态代码块

<1> 动态初始代码块:在初始化属性之前调用初始化代码块  {……}
<2> 静态初始代码块:在类加载时运行    static{……}  只被运行一次,往往用作一个类的准备工作

示例代码:

 

执行结果:

 

从结果看出,创建Linux类的实例时加载这个类,从而代码块执行,只是静态代码块先于动态代码块之前执行。那么,我们思考两个问题,类何时被加载,代码块、构造方法以及成员变量之间的执行顺序是谁先谁后??汗,别急,往下看。

先说一说类加载时机吧!!

(1)new 一个对象的时候,加载

(2)没有创建对象,访问类中静态方法(final和非final的均可以)和静态属性(不可以被final修饰,final修饰的静态属性是在常量池里),加载

(3)声明一个类的引用,不加载

(4)创建子类,先加载父类,再加载子类

(5)父类中的公开静态方法,子类继承,使用子类的类名调用此方法,加载父类

 注意,这里需要满足两个条件:

 <a> 子类不可以重写该静态方法,其实父类的静态方法子类是不可以重写只可以继承的。即使重写也要加上static关键字。那么也就说明父类的静态方法是不可以被子类重写的,子类重写的这个静态方法称之为子类自己的静态方法(只不过和父类的该静态方法重名罢了!!)

 <b>  main方法不可以在子类中,看例子代码,如下:

 

在主函数中运行以下代码:

//加载了父类之后,虚拟机已经知道m()方法的调用了,就不会再加载子类,延迟加载
Ubuntu.get();   

运行结果:


(6)没有创建对象,访问类中静态常量(能计算出结果的常量,在编译的时候会用计算出来的结果替换表达式),不加载 

(7)没有创建对象,访问类中静态常量(不确定的值),加载   

关于(6)(7),举两个个小例子吧??!!!

 

该例子中没有执行静态代码块,正如(6)所说。

运行结果:

 

再看一个例子,来说明(7)的正确性!!!

 

运行结果,执行静态代码块内容。

 

ok,上面说的都是关于类的加载时机问题,接着说说代码块、构造方法以及成员变量之间的执行顺序的问题。要想说明白这个问题,需要从两个方面说,一个是单纯的一个类,另一个就是一个类与另一个类的继承。

<1> 单纯的一个类

 

测试一下,呵呵!!

 

测试结果,如下:

 

<2> 具有继承关系的两个类

 

执行结果,如下:

 

至于,代码块与成员变量之间谁先谁后,其实是与它们在类中声明顺序有关的。现在以一个小例子说明问题:

 

测试:

 

运行结果:

 

 

 博客分享:

java类加载全过程http://my.oschina.net/volador/blog/87194

 

 

 

 

 

 

 

 

 

 

 

 


 


©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页