JAVA中的代码块以及继承关系中代码块和构造器的执行顺序

代码块

首先介绍代码块:代码块是定义在类中,类似于为构造器补充说明作用的一块代码

public class AAA {

	
	static{
		    System.out.println("AAA的静态代码块....");
	      }

	{
		System.out.println("AAA的普通代码块....");
	}
	
	public AAA() {
		System.out.println("AAA的构造器");
	}

}

和变量和方法类似,代码块也分为静态代码块和非静态代码块

静态代码块

和静态成员静态方法类似,它是属于整个类的,所以只会执行一次,静态代码块会在类加载时被执行(关于类的加载,有疑问的可以自行百度),也就是在类的静态成员装载到内存中的时候执行

表现形式为在代码块前面加一个static修饰符

非静态代码块

非静态代码块和非静态变量和非静态方法类似,它是属于每个实例对象的,所以他会在对象生成时被调用

单个类中代码块和构造器的执行顺序

我们首先要知道,静态代码块是在类加载时执行的,非静态代码块是在对象创建时执行的

 构造器中代码的执行顺序

然后我先介绍一下构造器中代码的执行顺序

		public BBB() {


            //1.调用super类

            //2.执行代码块

            //3.方法体中的代码
			System.out.println("BB的构造器");
		}

在构造器中,如果我们不显式的调用super,它会自动调用super,super关键字就是父类的引用,在单个类中因为父类是Object,这里不会执行代码,后面继承中的执行顺序会用到

然后会执行类中的代码块,最后执行构造器中的代码

然后当我们创建一个实例对象时,我们首先要加载这个类,这个时候静态代码块被执行,然后是普通代码块,最后执行构造器中的代码

 class BBB {
		static{
			System.out.println("BBB的静态代码块....");
		}
		{
			System.out.println("BBB的普通代码块....");
		}
		
		public BBB() {
			System.out.println("BB的构造器");
		}
		 
}

像上面这个类,如果我在主函数中生成一个BBB对象,输出顺序如下

JAVA中的代码块以及继承关系中代码块和构造器的执行顺序_第1张图片

总结一下:单个类中先执行静态代码块,其次普通代码块,最后是构造器的方法体

但是要注意:静态代码块只会在第一次函数加载的时候执行一次,后续如果再次创建类对象静态代码块不会在执行!

继承关系中代码块和构造器的执行顺序

由于篇幅有限也为了方便理解,这里使用两个类的继承来讲解(普通代码块就是非静态代码块

public class AAA {

	
	static{
		System.out.println("AAA的静态代码块....");
	}
	{
		System.out.println("AAA的普通代码块....");
	}
	
	public AAA() {
		System.out.println("AAA的构造器");
	}
}

 class BBB extends AAA {
		static{
			System.out.println("BBB的静态代码块....");
		}
		{
			System.out.println("BBB的普通代码块....");
		}
		
		public BBB() {
			System.out.println("BBB的构造器");
		}
		 
}

以上面这个代码为例,我在主函数中创建一个BBB对象,首先会调用BBB类的构造器,然后就要用到前面说过的构造器中代码的执行顺序,首先调用父类即AAA类的构造器,然后我们知道,在实例化一个对象之前首先要先加载这个类,所以首先加载AAA类,这个时候AAA的静态代码块会被执行,然后就该加载BBB类即子类,这个时候子类的静态代码块会被执行,这个时候需要用到的类都已经加载完毕,BBB类对象的创建需要以父类AAA类为基础,所以先执行父类的构造器,在构造体中先执行普通代码块后执行构造器代码,这个时候父类对象创建完毕,回到子类的构造器中,执行子类的普通代码块,最后执行子类的构造器代码,这样就执行完毕。

上述代码创建一个BBB类对象的输出如下

JAVA中的代码块以及继承关系中代码块和构造器的执行顺序_第2张图片

总结一下:

两个类时,首先执行父类的静态代码块,然后执行子类静态代码块

                然后执行父类普通代码块,父类构造器代码

                再然后执行子类普通代码块,子类的构造器代码

多个类的顺序和两个类的情况类似,只要明白了原理即可

你可能感兴趣的:(JAVA,java,开发语言)