java 父类子类静态成员,实例成员,构造函数初始化的顺序
2013-09-23 15:51
751 查看
java中的成员分为:
静态成员 : 静态成员变量,静态代码块,静态成员方法
实例成员:实例成员变量,实例代码块,实例成员方法
构造方法
析构方法
下面做的实验,主要是验证 当new 一个子类时,子类和它的父类中 静态成员变量,静态代码块,实例成员变量,实例代码块,构造方法 这5部分的执行顺序
父类代码:
子类代码:
在main中 执行语句 SubClass sc = new SubClass();
执行结果是: 1 2 3 4 5 6 7 8 9 10
执行过程分析:
当new 子类时,
首先由JVM找出相关的父类,先加载父类再加载子类; 【对应结果中的 1 2 3 4】
然后,进入子类的构造方法内部,先隐式地调用super()(也可显示调用无参数的或有参数的)来构造父类;【对应结果中的 5 6 7】
然后,初始化子类中的实例成员,(这一步在构造方法内部并没有显式的代码) ;【对应结果中的8 9】
最后,执行super()后面的其它语句。 【对应结果中的10】
由上面执行过程可知:
在构造方法里,执行语句super()和它后面的语句之间存在一个“过程”,在这个“过程"中执行的操作:初始化实例成员变量和执行实例代码块。
(这个过程应该也是由JVM默认执行的。)
静态成员 : 静态成员变量,静态代码块,静态成员方法
实例成员:实例成员变量,实例代码块,实例成员方法
构造方法
析构方法
下面做的实验,主要是验证 当new 一个子类时,子类和它的父类中 静态成员变量,静态代码块,实例成员变量,实例代码块,构造方法 这5部分的执行顺序
父类代码:
package _test; public abstract class AbstractClass { private static N n = new N(); //静态成员变量 static{ //静态代码块 System.out.println(2); } private M m = new M(); //实例成员变量 { //实例代码块 System.out.println(6); } public AbstractClass(){ //无参数的构造函数 System.out.println(7); } public AbstractClass(int i){ //有参数的构造函数 System.out.println(i); } } class M{ public M(){ System.out.println(5); } } class N{ public N(){ System.out.println(1); } }
子类代码:
package _test; public class SubClass extends AbstractClass { static{ //静态代码块 System.out.println(3); } private static U u = new U(); //静态成员变量 { //实例代码块 System.out.println(8); } private I i = new I(); //实例成员变量 public SubClass(){ super(); //显式调用父类的构造函数;如果不写,也会隐式调用 System.out.println(10); } } class I{ public I(){ System.out.println(9); } } class U{ public U(){ System.out.println(4); } }
在main中 执行语句 SubClass sc = new SubClass();
执行结果是: 1 2 3 4 5 6 7 8 9 10
执行过程分析:
当new 子类时,
首先由JVM找出相关的父类,先加载父类再加载子类; 【对应结果中的 1 2 3 4】
然后,进入子类的构造方法内部,先隐式地调用super()(也可显示调用无参数的或有参数的)来构造父类;【对应结果中的 5 6 7】
然后,初始化子类中的实例成员,(这一步在构造方法内部并没有显式的代码) ;【对应结果中的8 9】
最后,执行super()后面的其它语句。 【对应结果中的10】
由上面执行过程可知:
在构造方法里,执行语句super()和它后面的语句之间存在一个“过程”,在这个“过程"中执行的操作:初始化实例成员变量和执行实例代码块。
(这个过程应该也是由JVM默认执行的。)
相关文章推荐
- java 父类子类静态成员,实例成员,构造函数初始化的顺序
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序
- java父类、子类的构造函数、静态初始化、非静态初始化顺序
- Java父类、子类、静态成员和普通成员初始化的顺序
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- JAVA中父类与子类静态代码块、非静态代码块、构造函数的加载顺序
- [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- 【转】C#父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- java继承中父类和子类静态、非静态代码块,构造函数,静态方法的执行顺序
- [C#]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- java类中的静态成员和构造函数与子类中的顺序
- [C#]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- 子类调用父类构造器时的Java类成员初始化顺序
- Java 父类的构造函数执行要早于子类的实例变量初始化
- [C++]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)
- JAVA基础:子类、父类继承关系 静态块、非静态块、构造函数初始化顺序性、静态非静态方法覆盖
- Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)