zoukankan      html  css  js  c++  java
  • Java类加载顺序练习题

    一、题目

    public class Test {
    
    	public static Test t1 = new Test();// 标记1
    
        // 普通代码块
    	{
    		System.out.println("block A");// 标记2
    	}
    
        // 静态代码块
    	static {
    		System.out.println("block B");// 标记3
    	}
    
    	public static void main(String[] args) {
    		Test t2 = new Test();// 标记4
    	}
    
    }
    

    二、知识点

    类的加载顺序

    1. 父类静态对象和静态代码块
    2. 子类静态对象和静态代码块
    3. 父类非静态对象和非静态构造代码块
    4. 父类构造函数
    5. 子类非静态对象和非静态构造到代码块
    6. 子类构造函数
    7. 普通代码块

    上述加载顺序中,类中静态代码块按照声明顺序执行,并且1和2在类加载到方法区的时候执行,也就是不需要在调用new实例的时候就执行了。

    三、答案解析

    1. 首先进入Test类,没有父类,那就执行自身的静态对象和代码块,并且按照声明顺序执行。
    2. 所以首先执行标记1的静态对象,并且进行了实例化,所以需要调用相应的构造代码块,执行了标记2的语句,所以输出了block A;
    3. 执行完毕后顺序执行静态代码块,也就是标记3的语句,所以输出了blockB;
    4. 继续执行静态的main方法,重新实例化Test对象,再次调用构造代码块,再次输出了标记2的语句,所以再次输出了block A;

    所以最终的结果为:

    block A
    block B
    block A

  • 相关阅读:
    已经连接到空闲例程的解决方法
    SQLplus命令中导出数据
    Oracle设置时间格式
    Oracle热备份
    多元化控制文件
    ORA28000: the account is locked
    Windows 7 如何删除 Windows.old 文件夹
    Linux常用命令之文件命令
    Linux 常用命令之进程管理
    Python中的apply,filter和map函数
  • 原文地址:https://www.cnblogs.com/zxfei/p/11048681.html
Copyright © 2011-2022 走看看