关于类的静态加载顺序
来源:互联网 发布:开放源代码的软件 编辑:程序博客网 时间:2024/05/16 09:29
关于类中静态变量和静态方法以及构造方法之类的加载顺序问题现在成了面试中的基本问题,今天闲来无事,就写一篇博客来记述一下。
1、如果只是某个类自身的内部的情况
package com.cn.bb;public class TestParentStatic {static{System.out.println("父类静态代码块first");}private static String staticField = "父类静态变量";private String field = "父类普通变量";public TestParentStatic() {System.out.println("父类构造方法");}public void print(){System.out.println(field);}{System.out.println("父类构造代码块");}static{System.out.println(staticField);System.out.println("父类静态代码块second");}public static void main(String[] args) {TestParentStatic testStatic = new TestParentStatic();testStatic.print();}}
父类静态代码块first
父类静态变量
父类静态代码块second
父类构造代码块
父类构造方法
父类普通变量
由于静态变量和静态代码块处于同一优先级,所以加载顺序和他们的自身顺序有关。
由此可以看出加载顺序为:静态变量(静态代码块)> 构造代码块 > 构造方法 > 普通变量(普通方法)
2、如果是父类加子类的情况
package com.cn.bb;public class TestChildStatic extends TestParentStatic{static{System.out.println("子类静态代码块first");}private static String staticField = "子类静态变量";private String field = "子类普通变量";public TestChildStatic() {System.out.println("子类构造方法");}public void print(){System.out.println(field);}{System.out.println("子类构造代码块");}static{System.out.println(staticField);System.out.println("子类静态代码块second");}public static void main(String[] args) {TestChildStatic testChildStatic = new TestChildStatic();testChildStatic.print();}}
输出的运行结果:
父类静态代码块first
父类静态变量
父类静态代码块second
子类静态代码块first
子类静态变量
子类静态代码块second
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
子类普通变量
由上可以看出加载顺序为:
父类的静态变量(父类的静态代码块)> 子类的静态变量(子类的静态代码块)> 父类的构造代码块 > 父类的构造方法 > 子类的构造代码块 > 子类的构造方法 > 子类的普通变量
3、如果加载两次子类又会是什么样呢?
package com.cn.bb;public class TestChildStatic extends TestParentStatic{static{System.out.println("子类静态代码块first");}private static String staticField = "子类静态变量";private String field = "子类普通变量";public TestChildStatic() {System.out.println("子类构造方法");}public void print(){System.out.println(field);}{System.out.println("子类构造代码块");}static{System.out.println(staticField);System.out.println("子类静态代码块second");}public static void main(String[] args) {TestChildStatic testChildStatic = new TestChildStatic();TestChildStatic testChildStatic2 = new TestChildStatic();}}
输出的运行结果:
父类静态代码块first
父类静态变量
父类静态代码块second
子类静态代码块first
子类静态变量
子类静态代码块second
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
对比2和3的情况可以看出,静态变量和静态代码块只会初始化一次,而构造代码块和构造方法却和对象的创建有关,创建几次,就会加载几次。
阅读全文
0 0
- 关于类的静态加载顺序
- 类的加载顺序以及静态成员初始化顺序
- 关于Java的静态块和和非静态块(构造块)的加载顺序
- 关于jvm加载类的实现顺序
- 关于类变量的加载顺序问题
- 关于static的加载顺序
- 颠覆你思维的静态加载顺序
- jvm 静态类及非静态类的变量,方法加载顺序
- Java静态代码块和静态方法的区别/类加载顺序
- java 中类初始化,构造方法,静态成员变量,静态块的加载顺序
- java 类的加载、链接和初始化(静态属性的加载顺序)
- 静态与非静态块和变量的加载顺序
- java中静态块,静态属性,方法的加载顺序
- java中静态块和静态变量的加载顺序
- 关于Java中的静态块,非静态块,子类父类的静态块,非静态块的执行顺序
- 关于Java中的静态块,非静态块,子类父类的静态块,非静态块的执行顺序
- 关于静态数据的初始化顺序问题
- 关于类、方法、变量、语句块的加载顺序
- 安装 visual assist x 出现security key required问题
- 287. Find the Duplicate Number
- SpringIOC
- 多线程
- 第14周 项目1-2
- 关于类的静态加载顺序
- 把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方
- 摘录 线程安全总结
- JAVA Serializable 实例
- java自学笔记12:java中的集合框架(下)List
- Spring RestTemplate
- 动态规划问题和贪心算法
- tp5 原生SQL: 写操作(execute方法)
- js原型与原型链