前记:java技术随着互联网技术的发展,各种新技术理念层出不穷,为了更好的武装自己,先从深度开始,从基础开始。
千里之行始于足下,希望自己能得到更大的提高。
正文:直接贴代码如下
public class TestRef { public static void main(String[] args) { System.out.println(XYZ.name); // 输出结果如下: // Parent静态块 // xyz静态块 // XYZ name // new XYZ(); // 输出结果如下: // Parent静态块 // XYZ静态块 // Parent代码块 // Parent构造了 // XYZ代码块 // XYZ构造了 // new ABC(); // 输出结果如下: // Parent静态块 // ABC静态块 // Parent代码块 // Parent构造了 // ABC代码块 // ABC构造了 // ABC.getABC(); // 输出结果如下: // Parent静态块 // ABC静态块 } } class ABC extends Parent{ public static String name = "ABC name"; static { System.out.println("ABC静态块"); } public ABC() { System.out.println("ABC构造了"); } { // 构造方法在此代码块的前头,一样是代码块先加载 System.out.println("ABC代码块"); } public static String getABC(){ return "ABC"; } } class XYZ extends Parent{ public static String name = "XYZ name"; { // 代码块比构造方法先加载 System.out.println("xyz代码块"); } static { System.out.println("xyz静态块"); } public XYZ() { System.out.println("xyz构造了"); } } class Parent { public static String pname = "Parent name"; static { System.out.println("Parent静态块"); } { System.out.println("Parent代码块"); } public Parent() { System.out.println("Parent构造了"); } }
总结:当调用类的静态变量静态方法会使jvm加载类,过程中会执行静态代码块,而且加载顺序是 父类先加载,同时单纯的代码块是不会被执行的,所以没有打印代码块。
如果执行new创建对象会调用到代码块
顺序:父类静态代码块==》子类静态代码块==》父类代码块==》父类构造方法==》子类代码块==》子类构造函数
Good luck! 年薪过百万!