分析代码(子类对象指向父类引用,静态代码块)

    技术2022-07-16  68

    public static void main(String[] args) { A ab = new B(); ab = new B(); } } class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); }

    输出结果是

    1a2b2b

    先分析这句: A ab = new B(); 子类对象指向父类引用,先执行父类,又有如下的优先级关系, 静态代码块>普通代码块>构造方法 所以先执行父类静态代码快,子类静态代码块,父类构造函数,子类构造函数。 ab = new B(); 又新建对象,重新执行构造方法 父类>子类 static代码块只执行一次原因: static代码块只在类加载时执行,类是用类加载器来读取的,类加载器是带有一个缓存区的, 它会把读取到的类缓存起来,所以在一次虚拟机运行期间,一个类只会被加载一次,这样的话静态代码块只会运行一次。

    Processed: 0.015, SQL: 9