子类与父类的在类的启动时,遵循父类先加载,子类后加载的规则,常会用做于坑爹笔试题。下面看代码解释。 有两个类 Parent 和 Child,Child extend Parent。测试
public class Parent { public static int parent; static { System.out.println("This is Parent"); } } public class Child extends Parent { public static int child; static { System.out.println("This is Child"); } }
接下来,咱们写一个Test测试类来测试这父子类的加载顺序code
public class Test { public static void main(String[] args) { System.out.println(Child.child); } }
咱们来输出Child里的child变量,结果为对象
This is Parentclass
This is Child变量
0object
由此可看出,在访问Child里的静态成员变量child的时候,会引发类的加载,同时,子类加载以前,父类会先于子类加载。因此先输出父类结果,其次子类,最后本身的成员变量程序
紧接着,咱们再写一个Test类来访问父类笔试
public class Test { public static void main(String[] args) { System.out.println(Parent.parent); } }
结果为static
This is Parent笔试题
0
因而可知,在加载父类的时候,子类不会被加载。这个比较容易理解,由于全部的对象的父类都是object,若是你加载object时,子类也加载了,那程序岂不是要崩溃。。。
最后,再用下面的写法再作一个测试,用子类去访问父类的静态成员变量
public class Test { public static void main(String[] args) { System.out.println(Child.parent); } }
结果为
This is Parent
0
子类仍是没有被调用,这是为何呢,这里须要注意,虽然使用了Child的类,但并无访问Child的静态成员变量,因此不会引发Child类的加载,而父类Parent的静态成员变量被访问了,因此父类会加载。 结果就为上。