最近,在面试题或者面试上老是,提到静态块,静态变量,就仔细了解了下。
Java类里普遍存在静态快,构造块,构造函数,具体什么关系呢?
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
public class Study_static {
public static char text = 'a'; //静态对象
public Study_static(){ //构造函数
System.out.println('c');
}
{ //构造块
System.out.println('b');
}
static{ //静态块
System.out.println(text);
}
public static void main(String[] args){
Study_static a = new Study_static();
}
}
输出结果:
执行顺序优先级:静态块>main()>构造块>构造方法
所以先执行静态块,再tudy_static a = new Study_static();该语句创建对象,则又会调用构造块,输出构造块,再执行构造函数。
然而,这里的静态块,并不是仅仅静态块,而是静态域,包含了静态变量,静态块,这两者的执行顺序就是按照位置顺序进行。
总结:
1.静态块其实就是给类初始化的,而构造代码块是给对象初始化的。
2.静态代码块只会运行一次
3.静态块中的变量是局部变量,与普通函数中的局部变量性质没有区别。一个类中可以有多个静态代码块,执行顺序按照位置决定。
那么对于继承情况呢?
public class Study_static {
public static char text = 'a'; //静态对象
public Study_static(){ //构造函数
System.out.println('c');
}
{ //构造块
System.out.println('b');
}
static{ //静态块
System.out.println(text);
}
}
public class Study_static2 extends Study_static{
public static String text2 = "a1";
public Study_static2(){
System.out.println("c2");
}
{
System.out.println("b2");
}
static{
System.out.println(text2);
}
public static void main(String[] args){
Study_static2 a = new Study_static2();
}
}
结果:
当涉及到继承时,按照如下顺序执行:
- 执行父类的静态代码块,并初始化父类静态成员变量
- 执行子类的静态代码块,并初始化子类静态成员变量
- 执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
- 执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量