• 13. .class文件加载机制


    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");
        }
    }
    
    public class Hello {
        public static void main(String[] args) {
            A ab = new B();
            ab = new B();
        }
    }
    

    首先看题目 有AB两个子父类 ,每个类中都有一个静态块与构造实例

    然后拆解main方法中的代码块

    A ab = new B();
    // 上面这行代码 其实就是实例化了一个B对象
    // Java代码遵循两个原则,也是我们.class文件的加载机制
    // 1. 【静态块在类加载前执行 静态块一定优先于所有实例】
    // 2. 【子类对象在实例化时 会优先调用父类】
    
    // 所以静态块中的1,a优先执行 而且父类中的1优于a   ==》1,a
    // 然后按照父类优先原则 2优于b   ==》1,a,2,b
    
    ab = new B();
    // 又创建了一个B对象的实例
    // 这个时候按顺序执行还是:1,a,2,b
    // 但是【静态块中的内容只加载一次】,所以说1,a不再执行
    
    // 最终结果1,a,2,b,2,b
    
  • 相关阅读:
    getSupportFragmentManager要用在FragmentActivity及其子类中
    nginx 配置php
    openwrt 安装 ser2net 配置
    stm32 hid 键盘描述
    外部中断实验
    stm32 UART串口
    stm32 按键
    小结-stm32 驱动LED灯
    ASCII 计算机码
    debian/ubuntu安装桌面环境
  • 原文地址:https://www.cnblogs.com/forelim/p/15408414.html
Copyright © 2020-2023  润新知