JAVA中静态代码块,构造代码块,构造函数的加载顺序
2015-07-27 22:22
639 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yingqiuDemo/article/details/47092667
静态代码块:
在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
//如果类中包含多个静态代码块,那么将按照”先定义的代码先执行,后定义的代码后执行”。
//注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
构造代码块
直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
第一种:
//加载顺序:静态代码块 > 构造代码块 > 构造函数
其中 静态代码块只执行一次,构造代码块在每次创建对象时都会执行
class Test1 { public static void main(String[] args) { System.out.println("Hello JAVA!"); new GouZao1(); new GouZao1(); System.out.println("------------"); new GouZao2(); new GouZao2(); } } class GouZao1 { GouZao1(){ System.out.println("构造1 的 构造函数"); } static{ System.out.println("构造1 的 静态代码块"); } { System.out.println("构造1 的 构造代码块"); } } class GouZao2 { GouZao2(){ System.out.println("构造2 的 构造函数"); } static{ System.out.println("构造2 的 静态代码块"); } { System.out.println("构造2 的 构造代码块"); } } /* 打印结果: Hello JAVA! 构造1 的 静态代码块 构造1 的 构造代码块 构造1 的 构造函数 构造1 的 构造代码块 构造1 的 构造函数 ------------ 构造2 的 静态代码块 构造2 的 构造代码块 构造2 的 构造函数 构造2 的 构造代码块 构造2 的 构造函数 */
第二种:子父类中的静态代码块,构造代码块,构造函数的加载顺序。
//加载顺序:父类静态代码块> 子类静态代码块 > 父类构造代码块 > 父类构造函数 > 子类构造代码块 > 子类构造函数
class Test2 { public static void main(String[] args) { Zi z = new Zi(); } } class Fu { public Fu() { System.out.println("父类 构造函数"); } static { System.out.println("父类 静态代码块"); } { System.out.println("父类 构造代码块"); } } class Zi extends Fu { public Zi() { System.out.println("子类 构造函数"); } static { System.out.println("子类 静态代码块"); } { System.out.println("子类 构造代码块"); } } /*输出结果 父类 静态代码块 子类 静态代码块 父类 构造代码块 父类 构造函数 子类 构造代码块 子类 构造函数 */
但子父类中 使用类名调用时有一点要注意
class Test3 { public static void main(String[] args) { System.out.println(Zi.value); //System.out.println(Zi.v); } } class Fu { static int value = 6; static { System.out.println("Fu静态代码块"); } { System.out.println("父类构造代码块"); } } class Zi extends Fu { static int v = 9; static { System.out.println("Zi静态代码块"); } } /* 打印结果: Fu静态代码块 6 */
可以看出,子类静态代码块并未执行。
只有在执行注释的System.out.println(Zi.v); 语句时才会执行
执行的结果为:
Fu静态代码块 6 Zi静态代码块 9
如果将System.out.println(Zi.value);注释掉,只执行System.out.println(Zi.v);的话,输出结果为:
Fu静态代码块 Zi静态代码块 9
相关文章推荐
- 静态代码块、构造代码块以及构造函数的加载顺序
- 【26】静态代码块、构造代码块和构造函数的特点及加载顺序
- Java中构造函数、构造代码块、静态代码块等的执行顺序问题
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- JAVA类中,静态代码块,构造代码块及构造函数调用顺序
- Java学习笔记——静态代码块,构造代码块,构造函数间的执行顺序
- java静态代码块,构造代码块,构造函数执行执行顺序
- [java起步]构造函数、构造代码快、静态代码块的执行顺序
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
- 黑马程序员-java中构造函数、构造代码块、静态代码块及它们的初始化顺序
- java中的静态代码块、构造代码块、构造函数执行顺序
- java中静态代码块、代码块、构造方法的加载顺序
- Java类中子类和基类的构造代码块,静态代码块、子类构造函数,基类构造函数的执行顺序
- 静态代码块、构造代码块以及构造函数的加载顺序
- Java中代码块,静态代码块和构造函数的加载顺序
- JAVA中父类与子类静态代码块、非静态代码块、构造函数的加载顺序
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- 2. java中代码块的执行顺序示例(静态、构造、普通代码块,构造函数)