Java 类的初始化顺序
来源:互联网 发布:cs1.6 优化参数 编辑:程序博客网 时间:2024/06/06 13:55
一、 没有继承情况下:
<span style="font-size:18px;"><strong>package I;import java.awt.image.SampleModel;import java.lang.Thread.State;class Example{static {System.out.println("Example 的静态块");}{System.out.println("Example 块");}public Example(String s) {// TODO Auto-generated constructor stubSystem.out.println(s);}public Example() {// TODO Auto-generated constructor stubSystem.out.println("默认的构造函数");}}public class Tset {static Example e = new Example("静态成员的初始化");//先执行Example中的static . 块Example e_ = new Example();{System.out.println("块");}static {System.out.println("Static 块");if( e== null)System.out.println("e is null");e = new Example("静态块内部初始化");}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Test 的默认构造函数");}}</strong></span>
输出的结果是:
<span style="font-size:18px;"><strong>Example 的静态块Example 块静态成员的初始化Static 块Example 块静态块内部初始化Test 的默认构造函数</strong></span>
由此可以看出,在没有继承关系的提前下:首先执行的是Test类中的静态成员,(静态成员定义的Example类的对象),所以首先输出 Example中的static块中的内容,随后输出Example中块的内容,最后执行的Example的构造器,
第二步执行的是Test中的static块, (Example中的静态块之执行一次),输出Example中的块,之后是构造器。
第三部执行Test中的 成员变量
最后执行main入口中的内容
执行顺序如下:
1、静态成员变量首先初始化 2、普通成员初始化 3、执行构造函数
(static块 可以看成一个静态成员变量,它的执行顺序和它在类中声明的位置有关)
二、Java有继承情况下的初始化顺序:
package I;import java.awt.image.SampleModel;import java.lang.Thread.State;import java.text.SimpleDateFormat;class Sample{ Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); }}class Example{static {System.out.println("父类的static 块1");}static Sample sa = new Sample("父类静态成员1初始化");Sample saa = new Sample("父类成员1初始化");static Sample s = new Sample("父类静态成员2初始化");static {System.out.println("父类的static 块2");}public Example() {// TODO Auto-generated constructor stubSystem.out.println("Example默认构造函数的初始化");}Sample saaa = new Sample("父类成员2初始化");}public class Tset extends Example{static Sample s = new Sample("子类静态成员1的初始化");public Tset() {// TODO Auto-generated constructor stubSystem.out.println("子类默认构造函数的调用");}Sample sam1 = new Sample("子类1的初始化");static Sample s_ = new Sample("子类静态成员2的初始化");static {System.out.println("子类静态代码块的调用");}Sample as = new Sample("子类2的初始化");public static void main(String[] args) {// TODO Auto-generated method stubnew Tset();System.out.println("Test");}}输出的结果是:
父类的static 块1父类静态成员1初始化父类静态成员2初始化父类的static 块2子类静态成员1的初始化子类静态成员2的初始化子类静态代码块的调用父类成员1初始化父类成员2初始化Example默认构造函数的初始化子类1的初始化子类2的初始化子类默认构造函数的调用Test第一步执行的是父类静态成员初始化
第二步执行的是子类静态成员初始化
第三步执行的是父类普通成员的初始化和构造函数
第四步执行的是子类普通成员的初始化和构造函数
所以在Java初始化顺序中:
1、 继承体系所有的静态成员初始化(先是父类,后是子类)
2、父类初始化完成(普通成员的初始化->构造器)
3、子类初始化(普通成员的初始化->构造器)
0 0
- java类的初始化顺序
- Java类的初始化顺序
- Java类的初始化顺序
- Java类的初始化顺序
- Java类的初始化顺序
- java类初始化的顺序
- java类的初始化顺序
- Java类的初始化顺序
- java 类的初始化顺序
- Java类的初始化顺序
- java类的初始化顺序
- java类的初始化顺序
- JAVA类的初始化顺序
- Java类的初始化顺序
- java类的初始化顺序
- java 类的初始化 顺序
- java类的初始化顺序
- java类的初始化顺序
- 设计模式小结
- [LeetCode]Jump Game II
- 机器学习实战笔记(1)机器学习基础
- 浅谈-----Servlet
- Android学习手记(5) 基本UI布局
- Java 类的初始化顺序
- scanf
- 架构那些事3--架构演进
- Java Web 数据安全-面向Tomcat Server的HTTPS安全套接层配置
- printf
- #define预处理的弊端
- 3款很棒的编辑器
- 苏州OJ c003: 中缀转后缀
- android studio使用教程(二)常用的设置