`

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

    博客分类:
  • 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方法---》父类的构造语句块---》父类的构造方法---》子类的构造语句块---》子类的构造方法。

 

非常感谢大家的点评和指正,运行结果没有问题,只是顺序写错了。

1
1
分享到:
评论
8 楼 FireZHFox 2014-08-18  
FireZHFox 写道
jilo88 写道
同问!?没数错吗?


你觉得哪里错了?请指正


顺序确实错了,运行结果是正确的,顺序写错了,不好意思
7 楼 FireZHFox 2014-08-18  
FireZHFox 写道
yunduanyucan 写道
你确定顺序没有数错?


你觉得应该是什么顺序,请说明?谢谢


顺序确实是错了,运行结果没有问题,但是顺序写错了
6 楼 FireZHFox 2014-08-18  
肆无忌惮_ 写道
父类的静态语句块---》子类的静态语句块---》main方法---》父类的代码块---》父类的构造方法---》子类的代码块---》子类的构造方法。


不好意思,你的顺序是对的,非常感谢。
5 楼 FireZHFox 2014-08-18  
yunduanyucan 写道
你确定顺序没有数错?


你觉得应该是什么顺序,请说明?谢谢
4 楼 FireZHFox 2014-08-18  
jilo88 写道
同问!?没数错吗?


你觉得哪里错了?请指正
3 楼 肆无忌惮_ 2014-08-16  
父类的静态语句块---》子类的静态语句块---》main方法---》父类的代码块---》父类的构造方法---》子类的代码块---》子类的构造方法。
2 楼 jilo88 2014-08-16  
同问!?没数错吗?
1 楼 yunduanyucan 2014-08-15  
你确定顺序没有数错?

相关推荐

    【Java语言基础】初始化块

    文章目录【Java语言基础】初始化块使用初始化块静态初始化块总结代码 【Java语言基础】初始化块 初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,...

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    关于JVM的总结

    而在初始化阶段则通过程序制定的主管计划去初始化变量和其他资源,从另一个角度理解就是 执行类构造器的()方法 .()方法是由编译器自动收集类中的所有变量的复制动作和静态语句中的语句合并产生的. 静态语句块中只能...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    【04-面向对象(上)】

    •初始化块和构造器:初始化块总在构造器之前执行,初始化块不能接受形参。 静态初始化块 •用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块 , ...

    疯狂JAVA讲义

    5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 5.10 本章小结 165 本章练习 165 第6章 面向对象(下) 166 6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 =...

    Effective C# 使用成员初始化器而不是赋值语句

    无论是类成员(静态变量)合适实例变量,我们都应该充分利用初始化器的语法。 C#编程在,一般在声明一个变量的同时我们会对其进行初始化: 代码如下:1 class Employee 2 { 3 private List<Employee> empList = new ...

    java初学者必看

    7.4.6 初始化块 7.5 包 7.5.1 包的概念 7.5.2 类的导入 7.5.3 包名与目录 7.5.4 静态导入 7.5.5 Java包介绍 7.6 类设计技巧 7.7 实例:完善MasterCard类 7.7.1 构造方法 7.7.2 setter方法 7.7.3 getter...

    编程思想下篇

    5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章...

    21天学通Java-由浅入深

    191 10.1 什么是构造器 191 10.1.1 构造器的使用 191 10.1.2 被修饰的构造器 193 10.1.3 构造器方法与普通方法的区别 196 10.2 如何实例化一个对象 197 10.3 构造器的使用 199 10.3.1 构造器的调用 199 10.3.2 构造...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    Java入门教程(微学苑)-part1

    4.13 静态初始器(静态块) 75 4.14 静态导入 75 4.15 Java final关键字:阻止继承和多态 76 4.16 类与类之间的关系 78 4.17 依赖(uses-a) 78 4.18 聚合(has-a) 78 4.19 继承 79 4.20 Java Object类 79 4.21 equals...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 8.2.4 默认引入的包 204 8.3 命名习惯大回顾 204 8.4 Java中的注释 205 8.4.1 使用双...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 8.2.4 默认引入的包 204 8.3 命名习惯大回顾 204 8.4 Java中的注释 205 8.4.1 使用双...

    java面试800题

    类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值; (2)调用父类构造函数; (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (4)调用本身构造函数。" Q0053 "Public ...

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

Global site tag (gtag.js) - Google Analytics