如: class A { static { System.out.print("1"); } { System.out.print("ok"); } public A() { System.out.print("2"); } } class B extends A { static { System.out.print("a"); } public B() { System.out.print("b"); } } public class Hello{ public static void main(String[] ars){ A ab = new B(); //记为A。执行到此处,结果是: ab = new B(); //记为B。执行到此处,结果是: B bb=new B();//记为C。执行到此处,结果是: } } A、B、C处的执行结果是什么?
B:2b
C:2b
静态块只执行一次父类静态代码块 > 子类静态代码块 > 父类构造函数 > 子类构造函数(先有父亲,后有孩子)
如果是多级继承关系的话,最高层的父类首先执行,然后依次递减
总结:静态优先执行,父类优先执行
注意:静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次
构造方法和静态代码块的区别
静态代码块 当且仅当第一次执行的时候才执行,一般用于初始化。
而构造方法 是每次new对象的时候都执行,也是初始化
二者的区别在于 一个是仅执行一次 另一个是每次new对象的时候执行
所以初始化代码 写在那个部分里就要根据具体情况而进行选择
如:
{
System.out.print("什么情况下执行");
}它是什么情况下执行,又执行多少次呢?
class A {
static {
System.out.print("1");
} {
System.out.print("ok");
}
public A() {
System.out.print("2");
}
}
class B extends A {
static {
System.out.print("a");
} public B() {
System.out.print("b");
}
} public class Hello{
public static void main(String[] ars){
A ab = new B(); //记为A。执行到此处,结果是:
ab = new B(); //记为B。执行到此处,结果是:
B bb=new B();//记为C。执行到此处,结果是:
}
} A、B、C处的执行结果是什么?
楼主想知道原理要看虚拟机规范,不过这样的问题对java程序开发并没有多大帮助就是了。
例如
Class c1 = Class.ForName("A.class");
这种载入方式载入类的时候静态方法就只执行一次。
Class c2 = Class.ForName("A.class",true,null);
这种方式第二个参数就是载入类时是否调用静态方法。JAVA深度历险第二章 深入类别载入器,你可以看看。
楼主可以在Eclipse拷贝运行一下,看看结果是什么,增强自己的体会