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:总结如下:
类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)调用父类构造函数;
(3)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(4)调用本身构造函数。
在我们的程序中,实例化一个类对象的时候,运行顺序为:
- 父类静态块
- 父类构造器
- 本类中的块
- 本类的构造器