博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类加载器与类初始化深度剖析
阅读量:3707 次
发布时间:2019-05-21

本文共 4529 字,大约阅读时间需要 15 分钟。

import java.util.Random;/** * 在这里编写类的功能描述 * * @author wangkai * @created 2019/12/31 */public class MyTest7 {
public static void main(String[] args) {
System.out.println(FinalTest.x); System.out.println("---------"); System.out.println(FinalTest.y); }}class FinalTest{
public static final int x=3; public static final int y=new Random().nextInt(3); static {
System.out.println("FinalTest static block"); }}
  • public static final int x=3; 对这个变量的引用,不会触发FinalTest初始化,因为变量X在编译的时候,已经放到MyTest7的常量池中去了
  • public static final int y=new Random().nextInt(3); 由于变量y只有在运行期才能确定,所以会导致FinalTest的初始化

通过编译对比code为3的和18的可以看出

Compiled from "MyTest7.java"public class MyTest7 {
public MyTest7(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."
":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: iconst_3 4: invokevirtual #4 // Method java/io/PrintStream.println:(I)V 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 10: ldc #5 // String --------- 12: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 18: getstatic #7 // Field FinalTest.y:I 21: invokevirtual #4 // Method java/io/PrintStream.println:(I)V 24: return}

子类的初始化首先会导致父类的初始化

/* * Copyright (c) 2019 maoyan.com * All rights reserved. * *//** * 在这里编写类的功能描述 * * @author wangkai * @created 2019/12/31 */public class MyTest9 {
static{
System.out.println("MyTest10 static block"); } public static void main(String[] args) {
Parent2 parent2; System.out.println("--------"); parent2=new Parent2(); System.out.println("--------"); System.out.println(parent2.a); System.out.println("--------"); System.out.println(Child2.b); }}class Parent2{
static int a=3; static {
System.out.println("Parent2 static block"); }}class Child2 extends Parent2{
static int b=4; static {
System.out.println("Child2 static block"); }}

初始化只会首次调用的时候触发

/* * Copyright (c) 2019 maoyan.com * All rights reserved. * *//** * 在这里编写类的功能描述 * * @author wangkai * @created 2019/12/31 */public class MyTest9 {
static{
System.out.println("MyTest10 static block"); } public static void main(String[] args) {
Parent2 parent2; System.out.println("--------"); parent2=new Parent2(); System.out.println("--------"); System.out.println(parent2.a); System.out.println("--------"); System.out.println(Child2.b); }}class Parent2{
static int a=3; static {
System.out.println("Parent2 static block"); }}class Child2 extends Parent2{
static int b=4; static {
System.out.println("Child2 static block"); }}

通过子类调用父类静态变量,静态方法,都是对父类的主动使用

/* * Copyright (c) 2019 maoyan.com * All rights reserved. * *//** * 在这里编写类的功能描述 * * @author wangkai * @created 2019/12/31 */public class MyTest10 {
public static void main(String[] args) {
//通过子类调用父类静态变量,静态方法,都是对父类的主动使用 System.out.println(Child3.a); System.out.println("---------"); Child3.doSomething(); }}class Parent3{
static int a=3; static {
System.out.println("Parent3 static block"); } static void doSomething(){
System.out.println("do something"); }}class Child3 extends Parent3{
static {
System.out.println("child3 static block"); }}

调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化

/* * Copyright (c) 2019 maoyan.com * All rights reserved. * *//** * 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化,反射调用会触发类的初始化 * * @author wangkai * @created 2019/12/31 */public class MyTest11 {
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader loader=ClassLoader.getSystemClassLoader(); Class
clazz=loader.loadClass("CL"); System.out.println(clazz); System.out.println("-----------"); clazz=Class.forName("CL"); System.out.println(clazz); }}class CL{
static {
System.out.println("Classsss CL"); }}

转载地址:http://mobjn.baihongyu.com/

你可能感兴趣的文章
Openstack面试题和知识点总结
查看>>
C++ 实例化一个对象
查看>>
基于Spring boot+Vue的在线考试系统
查看>>
大数据学习路线
查看>>
前端学习路线
查看>>
推荐几个单机游戏下载网、高质量图片下载网
查看>>
数据库查询
查看>>
单臂路由配置
查看>>
静态路由及动态路由 RIP配置
查看>>
现代密码学:密码协议
查看>>
现代密码学:密钥管理
查看>>
数据库增删改
查看>>
RSA公钥
查看>>
【总】现代密码学复习要点总结(谷利泽)
查看>>
【sql-server 数据库 命令大全】
查看>>
数据结构与算法
查看>>
C/C++总结
查看>>
计算机组成原理总结
查看>>
1.3 QT界面美化
查看>>
2 QT数据传输(MVC)
查看>>