Java 非静态实例初始化

发布时间:2018-08-04作者:laosun阅读(1659)

Java

非静态初始化和静态初始化一模一样,只不过少了static关键字。但是如果两者共存的话,非静态初始化是比静态初始化慢一拍的。下边我们举两个例子来看一下。

    在继承关系中,静态初始化、非静态初始化和构造函数的执行顺序

    public class ExA {
    	static {
    		System.out.println("父类--静态代码块");
    	}
    
    	public ExA() {
    		System.out.println("父类--构造函数");
    	}
    
    	{
    		//非静态代码块
    		System.out.println("父类--非静态代码块");
    	}
    
    	public static void main(String[] args) {
    		new ExB();
    	}
    }
    
    class ExB extends ExA {
    	static {
    		System.out.println("子类--静态代码块");
    	}
    	{
    		//非静态代码块
    		System.out.println("子类--非静态代码块");
    	}
    
    	public ExB() {
    		System.out.println("子类--构造函数");
    	}
    }

    执行结果:

    父类--静态代码块
    子类--静态代码块
    父类--非静态代码块
    父类--构造函数
    子类--非静态代码块
    子类--构造函数

    从上边的例子我们可以得出非静态代码块的初始化顺序是在静态代码块的初始化之后。

    下边我们再来看另一个例子:

    class Mug{
    	public Mug(int marker) {
    		System.out.println("Mug("+marker+")");
    	}
    	void f(int marker){
    		System.out.println("f("+marker+")");
    	}
    }
    public class Mugs {
    	Mug mug1;
    	Mug mug2;
    	
    	{
    		//非静态代码块
    		mug1 = new Mug(1);
    		mug2 = new Mug(2);
    		System.out.println("mug1 & mug2 initialized");
    	}
    	Mugs(){
    		System.out.println("Mugs()");
    	}
    	
    	Mugs(int i){
    		System.out.println("Mugs(int i)");
    	}
    	
    	public static void main(String[] args) {
    		System.out.println("Inside main()");
    		//首先执行Mugs类中非静态代码块,创建两个对象。然后执行无参构造函数
    		new Mugs();
    		System.out.println("new Mugs() completed");
    		//再执行Mugs类中非静态代码块,这也是和静态代码块只初始化一次的不同之后,其次调用有参构造函数
    		new Mugs(1);
    		System.out.println("new Mugs(1) completed");
    	}
    
    }


0 +1

版权声明

 Java  源码

 请文明留言

0 条评论