java类成员初始化顺序
来源:互联网 发布:网狐棋牌源码分析 编辑:程序博客网 时间:2024/06/05 21:12
java中类的成员类型按照属于类还是属于对象来分可分为静态成员和非静态成员,按照数据类型来分可分为基本类型和引用类型,因此可细分为4种.
看如下代码
public class Super { private static int static_int = init_static_basic(); private static String static_str = init_static_refer(); private int a = init_basic(); private String str = init_refer(); static { System.out.println("父类静态初始化之前基本类型变量:"+static_int); System.out.println("父类静态初始化之前引用类型变量:"+static_str); static_int = 1; static_str = "static haha"; } { System.out.println("父类初始化之前基本类型变量:"+a); System.out.println("父类初始化之前引用类型变量:"+str); a = 3; str = "haha"; } private static int init_static_basic(){ System.out.println("在父类静态变量定义处直接赋值之前的基本类型变量:" + static_int); return 10; } private static String init_static_refer(){ System.out.println("在父类静态变量定义处直接赋值之前的引用类型变量:" + static_str); return "static super haha"; } private int init_basic(){ System.out.println("在父类非静态变量定义处直接赋值之前的基本类型变量:" + a); return 5; } private String init_refer(){ System.out.println("在父类非静态变量定义处直接赋值之前的引用类型变量:" + str); return "super haha"; } public Super(){ } public Super(int a, String str) { System.out.println("父类构造函数初始化之前基本类型变量:"+this.a); System.out.println("父类构造函数初始化之前引用类型变量:"+this.str); this.a = a; this.str = str; }}public class Sub extends Super{ private static int static_sub_int = init_static_basic(); private static String static_sub_str = init_static_refer(); private int sub_a = init_basic(); private String sub_str = init_refer(); static { System.out.println("子类静态初始化之前基本类型变量:"+static_sub_int); System.out.println("子类静态初始化之前引用类型变量:"+static_sub_str); static_sub_int = 1; static_sub_str = "static haha"; } { System.out.println("子类初始化之前基本类型变量:"+sub_a); System.out.println("子类初始化之前引用类型变量:"+sub_str); sub_a =4; sub_str = "haha"; } private static int init_static_basic(){ System.out.println("在子类静态变量定义处直接赋值之前的基本类型变量:" + static_sub_int); return 10; } private static String init_static_refer(){ System.out.println("在子类静态变量定义处直接赋值之前的引用类型变量:" + static_sub_str); return "static sub haha"; } private int init_basic(){ System.out.println("在子类非静态变量定义处直接赋值之前的基本类型变量:" + sub_a); return 5; } private String init_refer(){ System.out.println("在子类非静态变量定义处直接赋值之前的引用类型变量:" + sub_str); return "sub haha"; } public Sub(){ super(); } public Sub(int sub_a, String sub_str) { super(sub_a,sub_str); System.out.println("子类构造器初始化之前基本类型变量:"+this.sub_a); System.out.println("子类构造器初始化之前引用类型变量:"+this.sub_str); this.sub_a = sub_a; this.sub_str = sub_str; } public static void main(String[] args){ new Sub(100,"aas"); }}首先明确两点
1、父类初始化一定在子类之前
2、静态变量初始化一定在非静态变量之前
而且2的优先级高于1
所以总的顺序为:
1、父类静态成员初始化
2、子类静态成员初始化
3、父类非静态成员初始化
4、子类非静态成员初始化
其次,成员变量初始化有如下几种
1、JVM默认初始化
2、在定义变量处初始化
3、在代码块中初始化
4、在构造函数中初始化(非静态变量)
顺序从上到下(对于非静态变量,2和3谁在前谁先初始化)
具体输出如下:在父类静态变量定义处直接赋值之前的基本类型变量:0在父类静态变量定义处直接赋值之前的引用类型变量:null父类静态初始化之前基本类型变量:10父类静态初始化之前引用类型变量:static super haha在子类静态变量定义处直接赋值之前的基本类型变量:0在子类静态变量定义处直接赋值之前的引用类型变量:null子类静态初始化之前基本类型变量:10子类静态初始化之前引用类型变量:static sub haha在父类非静态变量定义处直接赋值之前的基本类型变量:0在父类非静态变量定义处直接赋值之前的引用类型变量:null父类初始化之前基本类型变量:5父类初始化之前引用类型变量:super haha父类构造函数初始化之前基本类型变量:3父类构造函数初始化之前引用类型变量:haha在子类非静态变量定义处直接赋值之前的基本类型变量:0在子类非静态变量定义处直接赋值之前的引用类型变量:null子类初始化之前基本类型变量:5子类初始化之前引用类型变量:sub haha子类构造器初始化之前基本类型变量:4子类构造器初始化之前引用类型变量:haha
由输出可以看出,类成员变量初始化顺序为:1、如果第一次调用了类的静态成员或者静态方法,那么JVM就会加载对应类文件,初始化其静态的成员变量,且该初始化操作只执行1次,初始化顺序为:
1.1 JVM进行父类静态成员的默认初始化,引用类型初始化为null,基本类型初始化为0之类的值
1.2 执行在父类静态变量定义处的初始化
1.3 执行父类静态代码块初始化
1,4 按照如上执行子类静态成员初始化
经过如上步骤后,父类和子类的静态成员都已经初始化完成。
2、非静态成员初始化
2.1 JVM进行父类非静态成员的默认初始化,引用类型初始化为null,基本类型初始化为0之类的值
2.2 执行在父类非静态变量定义处的初始化
2.3 执行父类非静态代码块初始化
2.4执行父类构造函数中非静态变量的初始化
2.5按照如上执行子类非静态成员初始化
阅读全文
0 0
- Java类成员初始化顺序
- java类成员初始化顺序
- java类成员初始化顺序
- Java 类成员初始化顺序
- Java成员初始化顺序
- java类的成员初始化顺序和初始化块顺序
- Java类成员变量的初始化顺序
- Java 类成员的初始化顺序
- java类成员变量的初始化顺序
- Java类成员变量的初始化顺序
- Java中类成员初始化顺序问题
- Java基础-类成员初始化顺序
- java类中成员初始化的顺序
- Java类成员的初始化顺序
- Java类成员的初始化顺序
- JAVA类的成员初始化顺序
- java 类成员的初始化顺序
- java中类成员初始化顺序
- MySQL批量更新
- Visible Lattice Points
- C++中类类型和基本数据类型的转换
- 康托展开
- java下 dec hex byte数组转换
- java类成员初始化顺序
- gvim常用的配置及插件 -windows
- 第一个完全凭兴趣去搭建的网站
- Linux进程全解7——父进程wait / waitip回收子进程
- maven引入log4j、slf4j冲突,java.…
- Java 中 Comparable 和 Comparator 比较
- 计算机视觉三大顶级国际会议
- C++排序算法之插入排序
- windows 环境使用 python scapy,graphviz