Java基础篇——静态代码块、静态方法、静态变量、构造方法、构造代码段相关

基本定义

  • 静态代码段

在Java类的设计中,如果某段代码想让其只执行一次,比如一个HashMap的生成,一个数据库连接池的产生,就可以把相关代码写入static{}包裹的代码段中。这个代码段就叫静态代码段,在项目启动时就主动执行,即由虚拟机内部完成调用,且只执行一次,适合做变量的初始化

  • 静态变量

任何方法都不能声明静态变量,只能在类体中生成,可以由整个类进行调用,在类被调用时被赋值。

  • 静态方法

在类被加载时装载,在类被调用时执行,且只能使用类中的其他静态变量,内部不能存在任何形式的this和super调用,因为static方法无需实例化任何对象。

  • 构造代码段

类加载时,即new ClassName()或Class.forName("ClassPath.ClassName.class")执行的代码。

  • 构造方法(构造函数)

在类需要实例化时进行调用,执行顺序滞后于构造代码段。

各段代码的执行顺序

静态代码段 >构造代码段>构造方法,如果有父类的话,先执行父类和子类的静态代码段并将父类和子类的静态变量进行装载,然后执行父类的构造代码段和构造函数,再次是子类的构造代码段和构造函数,即,基类静态代码段>子类静态代码段>基类构造函数段>基类构造方法>子类构造代码段>子类构造方法。这里用一个简单的例子证明一下。

public class Base {
	private static int numOne;
	private int numTwo;
	
	static {
		System.out.println("基类静态代码段的numOne:" + numOne);
		numOne = 10;
	}
	
	{
		System.out.println("基类构造代码段中的numOne:" + numOne + ", numTwo:" + numTwo);
		numTwo = 2;
	}
	
	public Base() {
		System.out.println("基类构造方法 numOne:" + numOne + ", numTwo:" + numTwo);
		numOne = 1;
		numTwo = 20;
	}
	
	protected void action() {
		System.out.println("被继承方法");
		doSome();
	}
	
	protected void doSome() {
		System.out.println(numOne + " " + numTwo);
	}
}
public class Son extends Base{
	private static int num;
	private int anoNum;
	
	static {
		System.out.println("子类静态代码段 num:" + num);
		num = 9;
	}
	
	{
		System.out.println("子类构造代码段 num:" + num + ", anoNum:" + anoNum);
		anoNum = 3;
	}
	
	public Son() {
		System.out.println("子类构造方法num:" + num + ", anoNum:" + anoNum);
		num = 30;
		anoNum = 90;
	}
	
	protected void doSome() {
		System.out.println(num + " "  + anoNum);
	}
}
public class Demo {
	public static void main(String[] args) {
		Son son1 = new Son();
		Base base = son1;
		Base anoBase = new Base();
		
		son1.action();
		base.action();
		anoBase.action();
	}
}

输出:

基类静态代码段的numOne:0
子类静态代码段 num:0
基类构造代码段中的numOne:10, numTwo:0
基类构造方法 numOne:10, numTwo:2
子类构造代码段 num:9, anoNum:0
子类构造方法num:9, anoNum:3
基类构造代码段中的numOne:1, numTwo:0
基类构造方法 numOne:1, numTwo:2
被继承方法
30 90
被继承方法
30 90
被继承方法
1 20

这里三个action执行过程是,son1.action本应通过对象son1查找到Son类的action方法并执行,发现不存在后,追溯至父类,找到后执行。对于base,执行如上操作,存在,通过类Son调用,不存在,则继续追溯。由于base变量的值与c的值一致,即都指向同一段Son空间,所以和son1的执行结果一致。对于anoBase,先查找类Base中是否存在action,发现存在后执行该方法,得到结果,1,20。

总结

静态块代码作用于类级别,类加载时被装载,且只被加载一次,用于进行属性的初始化,而构造方法和构造代码段作用于对象级别,当对象需要实例化时才被调用。构造代码段在每实例化一个对象时进行一次调用,并优先于构造函数,用于初始化实例环境和不同对象共性的实例化内容。构造函数每实例化一个对象时都会执行一次,用以初始化对象属性。

发布了29 篇原创文章 · 获赞 0 · 访问量 3306

猜你喜欢

转载自blog.csdn.net/smithlaod/article/details/82924287