java中的类加载执行顺序

Java中类加载执行顺序是:
主类中的静态代码块–>父类中的静态成员和静态代码块–>子类中的静态成员和静态代码块–>父类中的成员变量和构造代码块–>父类中的构造方法–>子类中的成员变量和构造代码块–>子类构造方法
示例:

package classTest;

class Father {
	//静态属性
	public static String str1= "父类中的静态属性";
	//普通属性
	public String str2 = "父类中的普通属性"; 
	//无参构造方法
	public Father(){
		System.out.println("父类的无参构造方法");

	}
	//有参构造方法
	public Father(int a ) {
		System.err.println("父类的有参构造方法"+a);
	}
	//静态代码块
	static {
		System.out.println(str1);
		System.out.println("父类的静态代码块");
	}
	//构造代码块
	{
		System.out.println(str2);
		System.out.println("父类的构造代码块");
		}
}

 class Son extends Father{
	 //子类中的静态属性
	 public static String str1 = "子类中的静态属性";
	 //子类中的普通属性
	 public String str2 = "子类中的普通属性";
	 //子类中的无参构造方法
	 public Son() {
		System.out.println("子类中的无参构造方法");
	}
	 //子类中的有参构造方法
	 public Son(int a ) {
		 //super(a);
		 System.out.println("子类中的有参构造方法"+a);
	 }
	 //子类中的静态代码块
	 static {
		 System.out.println(str1);
		 System.out.println("子类中的静态代码块");
	 }
	 //子类中的构造代码块
	 {
		 System.out.println(str2);
		 System.out.println("子类中的构造代码块");
	 }
 }
public class TestExecute {
public static void main(String[] args) {
	Son s = new Son();
	System.out.println("---------------");
	Son a = new Son(5); 
	System.out.println("main方法中的函数1");
	{
		System.out.println("main方法中的普通代码块1");
	}
	System.out.println("main方法中的函数2");
	{
		System.out.println("main方法中的普通代码块2");
	}
}
static {
	System.out.println("主类中的静态代码块");
}
}

结果:

主类中的静态代码块
父类中的静态属性
父类的静态代码块
子类中的静态属性
子类中的静态代码块
父类中的普通属性
父类的构造代码块
父类的无参构造方法
子类中的普通属性
子类中的构造代码块
子类中的无参构造方法
---------------
父类中的普通属性
父类的构造代码块
父类的无参构造方法
子类中的普通属性
子类中的构造代码块
子类中的有参构造方法5
main方法中的函数1
main方法中的普通代码块1
main方法中的函数2
main方法中的普通代码块2

类加载的顺序如上分析,在main方法中的普通方法和普通代码块按代码先后顺序执行,此时和类加载没什么关系。
在同一个类中静态属性和静态代码块的加载顺序取决于他们在类中出现的先后顺序,并且不能调用未定义的属性,即定义在前,调用在后
实例如下:

class TestA{
	public TestA() {
		System.out.println("Test--A");
	}
}
class TestB{
	public TestB() {
		System.out.println("Test--B");
	}
}
public class TestExecute {
	//静态属性
	public static TestA a = new TestA();
	//静态代码块
	static {
		System.out.println("静态初始代码块");
		//不能调用未定义的属性,此处会报错
		//System.out.println(b);
	}
	//静态属性
	public static TestB b = new TestB();
public static void main(String[] args) {
new TestExecute();
}
}

运行结果:

Test--A
静态初始代码块
Test--B

你可能感兴趣的:(Java小知识点)