关于Java的静态块、非静态块和静态方法
来源:互联网 发布:苹果数据线头焊接 编辑:程序博客网 时间:2024/06/03 19:49
一、代码块和构造函数的初始化顺序
先从实例代码开始
父类
public class SuperClass { static { System.out.println("super static block init"); } { System.out.println("no static block init"); } public SuperClass() { System.out.println("super Instance"); }
子类
public class SubClass extends SuperClass { static { System.out.println("sub static block init"); } { System.out.println("sub no static block init"); } public SubClass() { System.out.println("sub Instance"); }}
下面这行代码的数据结果是什么?
SuperClass superClass = new SuperClass();
输出结果
super static block initno static block initsuper Instance
总结:针对单个类,初始化顺序:静态代码块,非静态代码块,构造函数
下面的这行代码又会输出怎么样的结果?
SubClass subClass = new SubClass();
输出结果
super static block initsub static block initno static block initsuper Instancesub no static block initsub Instance
子类实例化时,输出的顺序如下:
父类的静态代码块->子类的静态代码块->父类的非静态代码块->父类的构造函数->子类的非静态代码块->子类的构造函数
二、代用静态方法和静态变量
下面的示例代码分析
父类
public class SuperClass { static { System.out.println("super static block init"); } { System.out.println("no static block init"); } public SuperClass() { System.out.println("super Instance"); } public static void superTest() { System.out.println("super method"); } public static final Integer countInteger = 123; public static final int countInt = 345;}
子类
public class SubClass extends SuperClass { static { System.out.println("sub static block init"); } { System.out.println("sub no static block init"); } public SubClass() { System.out.println("sub Instance"); } public static void sub() { System.out.println("sub method"); } public static final String hello = "hello"; public static final int testInt = 3; public static final Integer testInteger = 4;}
观察输出结果:
System.out.println(SuperClass.countInt); //345********************System.out.println(SuperClass.countInteger);// super static block init// 123********************System.out.println(SubClass.countInteger);// super static block init// 123********************System.out.println(SubClass.countInt);// 345********************SuperClass.superTest();// super static block init// super method********************SubClass.superTest();// super static block init// super method********************System.out.println(SubClass.testInt);// 3********************System.out.println(SubClass.testInteger);// super static block init// sub static block init// 4********************System.out.println(SubClass.hello);// hello********************SubClass.sub();// super static block init// sub static block init// sub method********************SubClass[] subClasses = new SubClass[2];//无任何内容输出
总结
- 子类调用父类的静态字段或者静态方法,只会触发父类的初始化;
- 父类调用父类的静态方法,会触发父类的静态块初始化;
- 子类调用子类的静态方法,会触发父类的静态块和子类的静态块的初始化;
- 关于Int,string 和Integer输出结果的不同,是由于Int和string类型在编译阶段jvm放到了常量池中。
参考:https://segmentfault.com/a/1190000005916150
0 0
- 关于Java的静态块、非静态块和静态方法
- 关于Java的静态块和和非静态块(构造块)的加载顺序
- JAVA静态块和非静态块的区别
- JAVA静态块和非静态块的区别
- JAVA静态块和非静态块的区别
- 关于Java中的静态块,非静态块,子类父类的静态块,非静态块的执行顺序
- 关于Java中的静态块,非静态块,子类父类的静态块,非静态块的执行顺序
- java 静态块 非静态块 构造方法 执行顺序
- java静态块 非静态块 构造方法顺序
- 静态块和非静态块区别
- 静态块和非静态块
- java静态和非静态代码块的执行顺序
- Java 静态代码块和非静态代码块
- Java 静态代码块和非静态代码块
- java静态块、非静态块以及继承的关系
- java 静态块与非静态块的执行顺序
- Java中静态变量、静态方法、静态代码块、非静态变量、非静态方法的简介(转)
- 关于静态块,静态方法,非静态方法,构造方法执行的顺序
- leetcode题解-349.Intersection of Two Arrays && 350. Intersection of Two Arrays II
- 使用libpng和GDI读取显示png图片
- win7下怎么配置ODBC数据源
- 如何做系列(1)- mybatis 如何实现分页?
- DeepID face recognition
- 关于Java的静态块、非静态块和静态方法
- Redis作者谈Redis应用场景
- 八大排序
- dmytrodanylyk/circular-progress-button源码解析(一)
- 视频直播-ijkplayer 集成全解
- 关于oracle存储过程的调用(java)
- Git命令详解
- self 和 super
- java常用数据结构常用方法