Java中类的初始化块问题(一)
2014-05-18 12:13
267 查看
声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(原文链接地址为http://blog.csdn.net/bettarwang/article/details/26138879),毕竟在csdn上看代码和提问、讨论都更方便。
Java中类进行初始化的地方有两个,一个是构造函数,另一个就是初始化块。而初始化块分为静态初始化块和非静态初始化块,它们都在构造函数之前执行,但是二者略有不同,静态初始化块是在类被加载到内存就开始执行,而非静态初始化块是在创建对象时,构造之前被执行。由以下两个例子即可看出。
例一:代码如下所示,输出结果为“static initial block",如图1所示。这说明只加载了静态初始化块,因为此时只有类被加载到内存,但是并没有创建对象。
![](https://img-blog.csdn.net/20140518120307828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQmV0dGFyd2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图1 只将类加载到内存时的输出结果
例二:依然使用上面的代码,唯一的变化是将注释的b=new Base();的注释符去掉,即此时会新建对象,此时输出为:
static initial block
name=Tom age=48
Base Constructor
如图2所示。这说明静态初始化块在非静态初始化块之前执行,而非静态初始化块在构造函数之前执行。
![](https://img-blog.csdn.net/20140518120438156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQmV0dGFyd2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图2 新建对象时的输出结果
由于初始化块的执行顺序是由它们在类中出现的顺序决定的,即先出现的比后出现的要先执行,因而或许有人会质疑:如果将上面的代码中的非静态初始化块放在静态初始化块中,那非静态初始化块是不是就在静态初始化块之前执行呢?验证一下便知,将代码修改为如下:
static initial block
name=Tom age=48
Base Constructor
如图3所示。这说明虽然初始化块执行的顺序由其在代码中的出现顺序决定,但是前提是相同属性的初始化块,即对于静态初始化块来说,它们的执行顺序是其出现的顺序;对于非静态初始化块来说,它们的执行顺序是其出现的顺序。但是对于不同属性的初始化块来说,静态初始化块总是比非静态初始化块先执行,而与它们在代码中出现的先后顺序无关。
![](https://img-blog.csdn.net/20140518121009015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQmV0dGFyd2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图3 修改了初始化块出现顺序的输出结果
Java中类进行初始化的地方有两个,一个是构造函数,另一个就是初始化块。而初始化块分为静态初始化块和非静态初始化块,它们都在构造函数之前执行,但是二者略有不同,静态初始化块是在类被加载到内存就开始执行,而非静态初始化块是在创建对象时,构造之前被执行。由以下两个例子即可看出。
例一:代码如下所示,输出结果为“static initial block",如图1所示。这说明只加载了静态初始化块,因为此时只有类被加载到内存,但是并没有创建对象。
import java.util.*; public class Base { private String name="Tom"; private int age=48; //静态初始化块 static { System.out.println("static initial block"); } //非静态初始化块 { System.out.println("name="+name+" age="+String.valueOf(age)); } public Base() { System.out.println("Base Constructor"); } public static void main(String[]args) { Base b; //b=new Base(); } }
图1 只将类加载到内存时的输出结果
例二:依然使用上面的代码,唯一的变化是将注释的b=new Base();的注释符去掉,即此时会新建对象,此时输出为:
static initial block
name=Tom age=48
Base Constructor
如图2所示。这说明静态初始化块在非静态初始化块之前执行,而非静态初始化块在构造函数之前执行。
图2 新建对象时的输出结果
由于初始化块的执行顺序是由它们在类中出现的顺序决定的,即先出现的比后出现的要先执行,因而或许有人会质疑:如果将上面的代码中的非静态初始化块放在静态初始化块中,那非静态初始化块是不是就在静态初始化块之前执行呢?验证一下便知,将代码修改为如下:
import java.util.*; public class Base { private String name="Tom"; private int age=48; { System.out.println("name="+name+" age="+String.valueOf(age)); } static { System.out.println("static initial block"); } public Base() { System.out.println("Base Constructor"); } public static void main(String[]args) { Base b; b=new Base(); } }结果此时输出仍然为:
static initial block
name=Tom age=48
Base Constructor
如图3所示。这说明虽然初始化块执行的顺序由其在代码中的出现顺序决定,但是前提是相同属性的初始化块,即对于静态初始化块来说,它们的执行顺序是其出现的顺序;对于非静态初始化块来说,它们的执行顺序是其出现的顺序。但是对于不同属性的初始化块来说,静态初始化块总是比非静态初始化块先执行,而与它们在代码中出现的先后顺序无关。
图3 修改了初始化块出现顺序的输出结果
相关文章推荐
- 关于java对象初始化的问题
- Java程序初始化过程中方法覆盖问题
- 剖析一个java对象初始化顺序问题
- Java中初始化基类的顺序问题2
- Java中初始化基类的顺序问题1
- java 初始化问题
- Eclipse之java虚拟机初始化失败问题已解决
- 关于java中变量的初始化的问题
- 深入JVM(3):由一个栈溢出的问题看Java类和对象的初始化续
- Java软件低级错误(十 九):静态变量的初始化问题
- 关于JAVA中变量的初始化及类属性的默认值问题
- Java对象数组初始化与NullPointerException问题
- Java对象数组初始化与NullPointerException问题
- 有关JAVA数组初始化的问题和加入JAR包的问题
- 在JAVA中初始化问题
- ArcIMS 中的javaConnector初始化Map问题
- Java对象数组初始化与NullPointerException问题
- JAVA初始化问题1
- C++和Java 的缺省初始化问题
- 关于Java中初始化顺序的问题