关于Java运行时静态变量、非静态变量、构造方法初始化的顺序
2018-01-24 10:21
495 查看
一:没有继承的情况下
在用Java定义一个类时,如果没有显示的继承其他的类(默认的继承Object类这里不考虑),那么在类中定义的变量的初始化顺序是:静态变量、非静态变量、构造方法。
下面为一个例子:
运行的结果如下:
解释:在系统加载Initialization1.class 之后就会首先初始化static变量car以及该类的静态方法demo();之后便会初始化非静态成员变量i,最后执行main()函数里面第一行对象初始化的语句。
二:在有继承的情况下
定义一个类,它继承自别的类,那么相关成员的初始化顺序为:父类(基类)的静态方法/静态变量、子类的静态方法/静态变量、父类的非静态变量和构造方法、子类的非静态变量和构造方法。
代码如下:
运行结果如下:
此外如果存在多重继承关系的话,这时会依次递归一直找到最终的父类为止。
在用Java定义一个类时,如果没有显示的继承其他的类(默认的继承Object类这里不考虑),那么在类中定义的变量的初始化顺序是:静态变量、非静态变量、构造方法。
下面为一个例子:
1 class Car{ 2 Car(){ 3 System.out.println("Constructor of Car!"); 4 } 5 } 6 public class Initialization1 { 7 private static Car car = new Car(); 8 private int i =demo(); 9 public static int demo(){ 10 System.out.println("Initialization of Integer i "); 11 return 1; 12 } 13 Initialization1(){ 14 System.out.println("Constructor of Initialization1 "); 15 } 16 public static void main(String[] args){ 17 Initialization1 ini = new Initialization1(); 18 } 19 }
运行的结果如下:
Constructor of Car! Initialization of Integer i Constructor of Initialization1
解释:在系统加载Initialization1.class 之后就会首先初始化static变量car以及该类的静态方法demo();之后便会初始化非静态成员变量i,最后执行main()函数里面第一行对象初始化的语句。
二:在有继承的情况下
定义一个类,它继承自别的类,那么相关成员的初始化顺序为:父类(基类)的静态方法/静态变量、子类的静态方法/静态变量、父类的非静态变量和构造方法、子类的非静态变量和构造方法。
代码如下:
1 class Car{ 2 Car(){ 3 System.out.println("Constructor of Car!"); 4 } 5 } 6 class Audi{ 7 private static int j =genNum() ; 8 public static int genNum(){ 9 System.out.println("Initialization of static Integer j "); 10 return 10; 11 } 12 private Car car = new Car(); 13 Audi(){ 14 System.out.println("Constructor of Audi!"); 15 } 16 17 } 18 public class Initialization1 extends Audi { 19 private char c = demo2(); 20 private static int i =demo1(); 21 public static int demo1(){ 22 System.out.println("Initialization of Integer i "); 23 return 1; 24 } 25 public static char demo2(){ 26 System.out.println("Initialization of Char c "); 27 return 'a'; 28 } 29 Initialization1(){ 30 System.out.println("Constructor of Initialization1 "); 31 } 32 public static void main(String[] args){ 33 Initialization1 ini = new Initialization1(); 34 } 35 }
运行结果如下:
Initialization of static Integer j Initialization of static Integer i Constructor of Car! Constructor of Audi! Initialization of Char c Constructor of Initialization1
此外如果存在多重继承关系的话,这时会依次递归一直找到最终的父类为止。
相关文章推荐
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨 .
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的研究
- Java中静态代码块,静态变量,静态方法,构造方法初始化顺序
- Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)
- java构造方法、静态变量初始化顺序的小例子
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨
- 关于静态变量,静态代码块,非静态变量,构造方法中变量实例化顺序
- java 初始化顺序以及由此可能引发的构造方法的潜在问题。
- Java静态方法,静态变量,初始化顺序
- 静态变量,静态块,静态方法,构造方法的初始化顺序
- java静态方法,静态变量,初始化顺序
- Java Static代码块与构造方法初始化顺序
- 理解Java类中构造方法的执行顺序和变量初始化
- JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解
- Java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- 深度理解JAVA本身的构造器及子父类构造方法的初始化顺序
- 深度理解JAVA本身的构造器及子父类构造方法的初始化顺序
- Java学习记录(一):Java中继承与静态static、非静态、构造方法等的初始化顺序