1,静态变量、静态代码块、变量、普通代码块、mian方法、构造函数的执行顺序是:(静态变量、静态代码块)> main方法 >(变量、普通代码块)>构造函数。
2,如果子类调用了父类,那么执行顺序是:(父类静态变量、父类静态代码块)>(子类静态变量、子类静态代码块)> main方法 >(父类变量、父类代码块)> 父类构造方法 >(子类变量、子类代码块)> 子类构造方法
3,子类继承父类简单举例说明:也就是说此时的运行顺序为:
-
父类静态块 -
自身静态块 -
父类块 -
父类构造器 -
自身块 -
自身构造器
/**
* 测试父类和子类代码执行顺序
*/
public class Father1 {
/**
* 父类静态代码块
*/
static {
System.out.println("父类1静态代码块");
}
/**
* 父类块
*/
{
System.out.println("父1类块");
}
/**
* 父类构造方法
*/
public Father1(){
System.out.println("父1类构造方法");
}
}
子类代码:
/**
* 测试父类和子类代码执行顺序
*/
public class Child1 extends Father1{
/**
* 子类静态代码块
*/
static {
System.out.println("子1类静态代码块");
}
/**
* 子类代码块
*/
{
System.out.println("子1类块");
}
/**
* 子类构造方法
*/
public Child1() {
System.out.println("子1类构造方法");
}
public static void main(String args[]){
System.out.println("main1方法");
/**
* 实例化
*/
Child1 c = new Child1();
}
}
执行结果是:
父类1静态代码块
子1类静态代码块
main1方法
父1类块
父1类构造方法
子1类块
子1类构造方法
4,子类2集成父类2,并且在类中实例化父类1。通过下面的例子可以知道静态变量和静态代码块的执行顺序,是按照他们在类中的顺序来执行的。那么执行顺序会是:父类2的静态--子类2的静态--main方法--父类2的常量--父类2的构造--子类2的常量--父类1的静态--父类1的常量-父类1的构造--子类2的构造。也就是说此时的运行顺序为:
-
父类2静态块 -
自身静态块 -
父类2块 -
父类2构造器 -
自身块 - 父类1静态块
- 父类1块
- 父类1构造器
-
自身构造器
父类:
/**
* 测试父类和子类代码执行顺序
*/
public class Father2 {
public static String F_STATIC_FILED = "父2类静态变量";
public String F_FILED = "父2类普通变量";
/**
* 父类静态代码块
*/
static {
System.out.println(F_STATIC_FILED);
System.out.println("父2类静态代码块");
}
/**
* 父类块
*/
{
System.out.println(F_FILED);
System.out.println("父2类块");
}
/**
* 父类普通方法
*/
public void f_method(){
System.out.println("父2类普通方法");
}
/**
* 父类构造方法
*/
public Father2(){
System.out.println("父2类构造方法");
}
}
子类:
/**
* 测试父类和子类代码执行顺序
*/
public class Child2 extends Father2{
public static String C_STATIC_FILED = "子2类静态变量";
public String C_FILED = "子2类普通变量";
/**
* 子类静态代码块
*/
static {
System.out.println(C_STATIC_FILED+"cccc");
System.out.println("子2类静态代码块");
}
/**
* 子类代码块
*/
{
System.out.println("子2类块");
}
/**
* 子类构造方法
*/
public Child2() {
System.out.println("子2类构造方法");
}
public static void main(String args[]){
System.out.println("main2方法");
/**
* 实例化
*/
Child2 c = new Child2();
}
Father1 f2 = new Father1();
}
执行结果是:
父2类静态变量
父2类静态代码块
子2类静态变量
子2类静态代码块
main2方法
父2类普通变量
父2类块
父2类构造方法
子2类块
父类1静态代码块
父1类块
父1类构造方法
子2类构造方法
5:总结如下:
类初始化时构造函数调用顺序:
在我们的程序中,实例化一个类对象的时候,运行顺序为:
- 父类
静态块 -
父类构造器 -
本类中的块 -
本类的构造器