Java中静态代码块,静态函数,静态属性,普通代码块,普通属性,构造函数,普通方法的执行顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ScongHW/article/details/81565185
public class Demo {
	
	{
		System.out.println("父类普通代码块执行!");
	}
	
	static{
		System.out.println("父类静态代码块执行!");
	}
	
	public Demo(){
		System.out.println("父类构造函数执行!");
	}
	
	
	public static void main(String[] args) {
		Demo1 d = new Demo1();
		d.Demo2();
	}
}

class Demo1 extends Demo{
	
	{
		System.out.println("子类普通代码块执行!");
	}
	
	static{
		System.out.println("子类静态代码块执行!");
	}
	
	public Demo1(){
		System.out.println("子类构造函数执行!");
	}
	
	public void Demo2(){
		System.out.println("普通方法执行!");
	}
	
}

执行结果:

            父类静态代码块执行!
            子类静态代码块执行!
            父类普通代码块执行!
            父类构造函数执行!
            子类普通代码块执行!
            子类构造函数执行!
            普通方法执行!

执行顺序:静态代码块>普通代码块>构造函数>普通方法

public class Demo {
	
	{
		a=2;
	}
	int a = 1 ;
	
	int b = 2;
	{
		b = 1;
	}
	
	@Test
	public void test01(){
		System.out.println("a="+a);
		System.out.println("b="+b);
	}
}

执行结果:a=1    b=1

出现这种现象的原因:程序开始前会先初始化a=0,b=0,然后程序按顺序执行。因此可以理解为普通属性先被初始化。

public class Demo {
	
	public static String name= "zhangsan";
	
	static{
		System.out.println(name);
	}
	
	static{
		System.out.println(name2); //程序会报错
	}
	public static String name2= "lisi";
	
}

上述代码块会报错,原因:name2属性未被定义,因此可以理解为静态代码块和静态属性谁在前谁先被加载。

public class Demo {
	
	public static String name= "zhangsan";
	
	
	public static void fun01(){
		name = "lisi";
	}
	
	static{
		System.out.println(name);	
	}
	
	public static void main(String[] args) {
		System.out.println(name);
		fun01();
		System.out.println(name);
	}
}

执行结果:

              zhangsan
              zhangsan
              lisi

因此:静态函数在类被加载时就会被加载,但只有当其被调用时才会被执行。

综上:加载顺序:静态变量(静态代码块或静态函数)>普通属性 > 普通代码块 > 构造函数 > 普通函数

                    静态变量、静态代码块、静态函数的加载顺序由它们所在的位置有关

           执行顺序:静态变量(静态代码块) > 普通属性 > 普通代码块 > 构造函数  

                    静态函数和普通函数只有被调用才会执行

注:静态变量和静态代码块只会执行一次

猜你喜欢

转载自blog.csdn.net/ScongHW/article/details/81565185