简介
Java初始代码块主要分为静态代码块和非静态代码块。
静态代码块:是在类首次被JVM加载时执行且执行一次,并且在其中只能对静态变量进行初始化。
非静态代码块:是在生成一个对象时执行且在构造函数之前,主要做一些初始变量的工作。
普通情况
执行顺序为:静态代码块>非静态代码块>初始化方法>类的方法
package com.learn.pra05;
public class Demo01 {
/**
* 这是静态初始块
*/
static{
System.out.println("In static initialization block!");
}
/**
* 这是构造函数
*/
public Demo01(){
System.out.println("In constructor!");
}
/**
* 这是非静态初始块
*/
{
System.out.println("In non-static initialization block!");
}
/**
* 类的一个方法
*/
public void function(){
System.out.println("This is my function!");
}
public static void main(String[] args){
Demo01 demo=new Demo01();
demo.function();
}
}
执行结果:
为了证明静态代码块只执行一次,这里修改上面代码:
public static void main(String[] args){
Demo01 demo1=new Demo01();
demo1.function();
Demo01 demo2=new Demo01();//创建2个对象
demo2.function();
}
执行结果:
很容易看到确实静态代码块只执行了一次。
继承情况
在继承机制中,创建子类对象时会先初始化父类对象再初始化子类对象,所以这里又涉及到了代码块的执行顺序。
简单概括为:父类静态代码块>子类静态代码块>父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数
以上执行顺序会依次进行,若没有就跳过,直到结束。
例题:
package com.learn.pra05;
class Demo01 {
/**
* 父类静态初始块
*/
static{
System.out.println("Father initialization block!");
}
/**
* 父类构造函数
*/
public Demo01(){
System.out.println("Father constructor!");
}
/**
* 父类非静态初始块
*/
{
System.out.println("Father non-static initialization block!");
}
/**
* 类的一个方法
*/
public void function(){
System.out.println("This is my function!");
}
}
public class Demo02 extends Demo01{ //继承
/**
* 子类静态初始块
*/
static{
System.out.println("Child static initialization block!");
}
/**
* 子类构造函数
*/
public Demo02(){
System.out.println("Child constructor!");
}
/**
* 子类非静态初始块
*/
{
System.out.println("Child non-static initialization block!");
}
/**
* 重写父类function
*/
public void function(){
System.out.println("Overriding function!");
}
public static void main(String[] args){
Demo02 demo2=new Demo02();
demo2.function();
}
}
执行结果: