Java继承和静态-加载顺序
class A { static int cnt = 0; static { System.out.println("a()"); } int a = 1; A() { System.out.println("A()"); System.out.println(cnt); } } class B extends A { static { System.out.println("b()"); } int b = 10; B() { System.out.println("B()"); cnt++; System.out.println(cnt); } } class C extends B { static { System.out.println("c()"); } int c = 1000; C() { cnt++; System.out.println("C()"); System.out.println(cnt); } } class Demo { public static void main(String[] args) { C c1 = new C(); System.out.println(); B b1 = new B(); System.out.println(); A a1 = new A(); } }
输出结果
static静态的特性是只加载一次,构造一个类对象时,先按照父类(最原始的父类开始依次向下)-子类的顺序先加载类,类的成员变量和方法,这里的类方法为静态,所以在下面构造对象时,不会再加载,只加载一次。
加载完模板后,还是按照这个顺序调用构造函数,没有特别指明则是调用默认的。
注意这里的cnt在A的构造函数上没有自加,凡是调用B和C的构造函数,都会自加,调用父类也同样