Java 代码执行顺序(1)

主要记录下java实例化对象、静态代码块等代码执行的顺序

Java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。

所以java对象实例化时的顺序为:

1,父类的静态成员变量和静态代码块加载
2,子类的静态成员变量和静态代码块加载
3,父类成员变量和方法块加载
4,父类的构造函数加载
5,子类成员变量和方法块加载
6,子类的构造函数加载

class X {
	Y b = new Y();//实例化对象
	int number1 = num();//父类中的成员变量
    int num(){//父类中的成员函数
        System.out.println("父类成员变量num加载");
        return 666;
    }
    static int number2=num2();//父类中的静态成员变量
    static int num2(){//父类中的静态成员函数
        System.out.println("父类静态成员变量num2加载");
        return 666666;
    }
	static {//X中静态代码块
		System.out.print("父类中的静态代码块加载"+"\n");
	}
	 {
	        System.out.println("父类普通方法块加载");
	 }
	//Y b = new Y();
	public X() {
		System.out.print("父类中的构造函数加载"+"\n");
	}
	//Y c = new Y();
}

class Y {
	static {
		System.out.print("类中调用其他类时,其他类的静态函数加载"+"\n");
	}
	Y() {
		System.out.print("类中调用其他类时,其他类的构造函数加载"+"\n");
	}
}

public class Z extends X {
	Y y = new Y();
	int number = num();//父类中的成员变量
    int num(){//子类中的成员函数
        System.out.println("子类成员变量num加载");
        return 555;
    }
    static int number2=num2();//父类中的静态成员变量
    static int num2(){//父类中的静态成员函数
        System.out.println("子类静态成员变量num2加载");
        return 55555;
    }
	static {
		System.out.print("子类中的静态代码块"+"\n");
	}
	 {
	        System.out.println("子类普通方法块加载");
	 }
	Z() {
		//super();//默认,供系统底层检查调用,而不具体执行class Z的构造方法
		System.out.print("子类中的构造函数加载"+"\n");
	}

	public static void main(String[] args) {
		Z z=new Z(); 
	}
} 

过程:子类main函数中实例化对象 z,先加载父类;

父类静态成员变量/父类静态代码块(顺序执行)>子类静态 ;

若父类中调用其他类,在父类和子类的静态内容执行完成后 ,再执行;

父类普通方法块>构造函数>

运行结果:

父类静态成员变量num2加载 //静态内容执行
父类中的静态代码块加载
子类静态成员变量num2加载
子类中的静态代码块
类中调用其他类时,其他类的静态函数加载 //父类中的调用其他类 其它类中的static{}(只执行一次)
类中调用其他类时,其他类的构造函数加载 //其它类中的构造方法
子类成员变量num加载 //此处是父类和子类的同名成员函数num 就近原则执行了子类的(大概,测试不同名执行父类)
父类普通方法块加载
父类中的构造函数加载
类中调用其他类时,其他类的构造函数加载 //其它类中的构造方法
子类成员变量num加载
子类普通方法块加载
子类中的构造函数加载

网上关于父类静态 、普通代码块、构造函数和子类中的这些 的执行顺序有很多,我主要是遇到了父类中再调用其他类进行对象实例化,记录一下顺序的学习。

参考文章:

(8条消息) java对象实例化顺序_浮生一梦-CSDN博客_java实例化对象执行顺序

上一篇
下一篇