java 静态语句块 构造快 构造器的初始化顺序_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java 静态语句块 构造快 构造器的初始化顺序

java 静态语句块 构造快 构造器的初始化顺序

 2014/8/15 18:34:52  FireZHFox  程序员俱乐部  我要评论(0)
  • 摘要:/***AllRightsReserved.*/packagecom.thinkInJava.chapter05;publicclassFather{publicFather(){System.out.println("Father");}static{System.out.println("IamFatherclass");}{System.out.println("FatherClass");}}子类:packagecom.thinkInJava.chapter05
  • 标签:构造 Java 初始化顺序 构造器
class="java">/*
 * 
 * All Rights Reserved.
 */
package com.thinkInJava.chapter05;


public class Father {

    public Father() {
        System.out.println("Father");
    }

    static {
        System.out.println("I am Father class");
    }

    {
        System.out.println("Father Class");
    }
}

?

子类:

?

package com.thinkInJava.chapter05;


public class Sun extends Father{

    public Sun(){
        System.out.println("Sun");
    }
    
    static{
        System.out.println("I am sun class");
    }
    
    {
        System.out.println("sun class");
    }
    
    public static void main(String[] args) {
        new Sun();
    }
}


运行结果:

I am Father class
I am sun class
Father Class
Father
sun class
Sun

?

当 类在进行初始化时一定是先初始化父类中的静态的内容,父类静态的内容出事完毕后,会初始化子类中的静态内容,然后会再次查看父类中是否存在非静态的内容, 如果有则进行初始化,然后回到子类中查找是否存在非静态的内同需要初始化,如果有则进行初始化。最后执行父类中的构造方法,父类构造方法执行完后执行子类 的构造方法。

总结:

父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。

?

在进一步改进一下子类中main方法结果会是怎样呢?

    public static void main(String[] args) {
        new Sun();
        System.out.println("===================");
        new Sun();
    }


运行结果:

I am Father class
I am sun class

Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun

从运行结果看到红色变大的字体部分属于父类和子类中的静态内同:运行顺序依然是:父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。

但是我们在main方法中创建了两个子类对象,但是静态内同值初始化一次,而构造语句块每次都会初始化,这也是构造语句块和静态语句块的区别。

?

再次修改子类中的main方法

    public static void main(String[] args) {
        
        System.out.println("main start");
        new Sun();
        System.out.println("===================");
        new Sun();
        System.out.println("main end");
    }


运行结果如下:

I am Father class
I am sun class
main start
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
main end

通过运行结果可以看到完整的执行顺序为:父类的静态语句块---》子类的静态语句块---》main方法---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。

  • 相关文章
发表评论
用户名: 匿名