静态的方法或者方法块在 类加载的时候就已经初始化了,在类加载的时候 静态绑定。
一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
类装载步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
类装载步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
普通块和静态块的异同:
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋 值。
不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。
静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以 在普通方法中定义(个人感觉作用不大);而静态代码块不行。
示例:
父类方法:
package 方法块;
public class father {
static{
System.out.println("父类的静态方法块");
}
{
System.out.println("父类的方法块");<pre name="code" class="java"><span style="white-space:pre"> </span>}
public father() {System.out.println("父类的构造函数");}}
子类方法:
package 方法块;
public class son extends father{
static{
System.out.println("子类的静态方法块");
}
{
System.out.println("子类的方法块");
}
public son() {
System.out.println("子类的构造函数");
}
public static void main(String[] args) {
son s = new son();
}
}
执行的顺序:
main中new 出子类实例时,由于子类继承了父类,会去先装载父类,由于静态方法块在装载的时候就会执行,所以判断父类中是否有静态的方法块,执行完毕后,再去子类中查找是否有静态的方法块,当子类的静态方法块执行完后,执行父类的普通方法块和父类的构造函数,执行结束后,再执行子类的普通方法块和子类的构造函数。
执行结果:
父类的静态方法块
子类的静态方法块
父类的方法块
父类的构造函数
子类的方法块
子类的构造函数