java类 连接时机_Java类初始化时机测试方法解析

()方法

Java 类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。 如果类中没有静态语句和静态代码块,那可以不生成() 方法。

并且 () 不需要显式调用父类(接口除外,接口不需要调用父接口的初始化方法,只有使用到父接口中的静态变量时才需要调用)的初始化方法 (),虚拟机会保证在子类的 () 方法执行之前,父类的 () 方法已经执行完毕(所以java.lang.Object 类总是第一个被加载)

8dcfeac911d11b41120155a287eaca23.png

准备父类和子类

class Father {

static int father_a = 1;

static {

System.out.println("父类静态代码块执行");

}

static class StaticInnerClass {

static {

System.out.println("静态内部类静态代码块执行");

}

}

}

class Son extends Father {

static {

System.out.println("子类静态代码块执行");

son_a = 300;

}

static int son_a = 100;

static final int M = 1;

}

Main方法:

1:父类没有被引用但是会被先加载

new Son();

d044764f8f3bbd5a9e748e041458f5ef.png

2:反射也会产生主动引用:

Class a = Class.forName("clinit.Son");

(运行结果同1)

3:子类使用父类静态变量或方法不会产生类的引用

System.out.println("Father.a = " + Son.father_a);

cba21e82b5c4609b6761cab9e72e5cc1.png

4:通过类创建数组不会加载类(只是开辟一块空间)

Son[] sons = new Son[8];

bae0cd7129b633c3ed1544b2fb638747.png

5:使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)

System.out.println("Son.CONST = " + Son.CONST);

7734a2739e6da3a4b88fa8aafa2dd8c4.png

6:引用静态内部类不会加载外部类(应用于单例模式)

new Father.StaticInnerClass();

c698f4be45da7550b32693bad555c166.png

代码总结:

public static void main(String[] args) throws Exception {

// 1.父类没有被引用但是会被先加载

// new Son();

// 2.反射会产生主动引用

// Class a = Class.forName("clinit.Son");

// 3.子类使用父类静态变量或方法不会产生类的引用

// System.out.println("Father.a = " + Son.father_a);

// 4.通过类创建数组不会加载类(只是开辟一块空间)

// Son[] sons = new Son[8];

// 5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)

// System.out.println("Son.CONST = " + Son.CONST);

// 6.引用静态内部类不会加载外部类(应用于单例模式)

// new Son.StaticInnerClass();

}

}

PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前

public class Test {

public static void main(String[] args) {

System.out.println("a = " + cls.a);

}

}

class cls {

static int a = 10;8 static { a = 20; }9 }

8bbec20e4f1b24b9cfd95b1bde8d8c3d.png

如果 调换顺序输出结果将是 a = 10

class cls {

static { a = 20; }

static int a = 10;

}

61026629e8d69582e99e5392dba4e9c7.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值