java 4中代码块执行顺序

阅读更多
public class FF extends DD
{
    {
        System.out.print("1");       
    }
    
    FF()
    {
        super(7);
        System.out.print("2");
    }
    
    static
    {
        System.out.print("3");
    }
    
    public static void main(String[] args)
    {
        FF f = new FF();
    }
}

class DD
{
    DD(int x)
    {
        System.out.print("4");
        System.out.print(x);
    }
    
    static
    {
        System.out.print("5");
    }
    
    {
        System.out.print("6");
    }
}



先把输出的结果写出来吧:5364712

我们知道static代码块是在装载代码的时候就放在代码区的,

然后寻找静态的main方法

无疑问,静态的代码是先执行的,而类FF继承了DD,

所以父类的静态代码先执行再执行子类的静态代码,

这时会输出:53

由于{}代码块优先级大于构造函数,所以先执行父类的{}代码块,

这时输出是:536

下面关键的来了,类之所以成为类的关键:一定要有构造方法。所以最后要形成父类的形态,再子类中的构造器一定要有调用父类构造方法的声明,即super(***);而并非现在就执行了子类的构造方法,可以理解为只是执行了Super()方法所致
这时输出是53647

接下来在一子类中:构造代码块优先于普通代码块
这时输出是5364712




小结:
1.静态的属性和静态的语句块都是在类加载的时候完成,非静态的东西是在创建对象的时候执行的.

2.单个类的初始化顺序如下:
  静属->静块->非静属->非静块->构造函数.

3.有继承关系的类的初始化顺序如下:
    父静属->父静块->子静属->子静块
  ->父非静属->父非静块->父构造->子非静属->子非静块->子构造.

比如你要生成一个子类的对象,当然先得知道父类的形态啦,有父才有子嘛。先父类静态代码块,再子类静太代码块,先父非静太代码块,再子类非静态代码块。

你可能感兴趣的:(java,JVM)