2014-03-26类中静态变量的初始化(摘自thinking in java)
来源:互联网 发布:手机摇一摇软件 编辑:程序博客网 时间:2024/06/09 22:50
. 静态数据的初始化
若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些:
Bowl允许我们检查一个类的创建过程,而Table和Cupboard能创建散布于类定义中的Bowl的static成员。注意在static定义之前,Cupboard先创建了一个非static的Bowl b3。它的输出结果如下:
static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用Table.b1或Table.b2,那么static Bowl b1和b2永远都不会创建。然而,只有在创建了第一个Table对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static对象。大家可从输出结果中找到相应的证据。
若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些:
//: StaticInitialization.java// Specifying initial values in a// class definition.class Bowl { Bowl(int marker) { System.out.println("Bowl(" + marker + ")"); } void f(int marker) { System.out.println("f(" + marker + ")"); }}class Table { static Bowl b1 = new Bowl(1); Table() { System.out.println("Table()"); b2.f(1); } void f2(int marker) { System.out.println("f2(" + marker + ")"); } static Bowl b2 = new Bowl(2);}class Cupboard { Bowl b3 = new Bowl(3); static Bowl b4 = new Bowl(4); Cupboard() { System.out.println("Cupboard()"); b4.f(2); } void f3(int marker) { System.out.println("f3(" + marker + ")"); } static Bowl b5 = new Bowl(5);}public class StaticInitialization { public static void main(String[] args) { System.out.println( "Creating new Cupboard() in main"); new Cupboard(); System.out.println( "Creating new Cupboard() in main"); new Cupboard(); t2.f2(1); t3.f3(1); } static Table t2 = new Table(); static Cupboard t3 = new Cupboard();} ///:~
Bowl允许我们检查一个类的创建过程,而Table和Cupboard能创建散布于类定义中的Bowl的static成员。注意在static定义之前,Cupboard先创建了一个非static的Bowl b3。它的输出结果如下:
Bowl(1)Bowl(2)Table()f(1)Bowl(4)Bowl(5)Bowl(3)Cupboard()f(2)Creating new Cupboard() in mainBowl(3)Cupboard()f(2)Creating new Cupboard() in mainBowl(3)Cupboard()f(2)f2(1)f3(1)
static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用Table.b1或Table.b2,那么static Bowl b1和b2永远都不会创建。然而,只有在创建了第一个Table对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static对象。大家可从输出结果中找到相应的证据。
0 0
- 2014-03-26类中静态变量的初始化(摘自thinking in java)
- 《Thinking in Java》——静态、非静态成员变量、子句的初始化顺序(含继承)及对象创建过程
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- Thinking in java 之:静态数据的初始化及初始化顺序
- Java类的初始化顺序 (静态变量、静态初始化块、变量 )
- Thinking in java-23 类的加载、链接和初始化
- p95 静态数据初始化 thinking in java 4
- Thinking in Java之静态数据初始化顺序
- Java static-摘自thinking in Java
- Thinking in Java 类加载与初始化
- (Thinking in Java学习笔记)初始化
- 继承与初始化过程(摘自Thinking in java 3th edition)
- [转] Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造方法)
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器
- java 中类初始化,构造方法,静态成员变量,静态块的加载顺序
- git fetch VS git pull
- Ajax初步理解
- 第十六章--访问文件
- jspel的使用1
- [DFS&&剪枝]uva10400 Game Show Math
- 2014-03-26类中静态变量的初始化(摘自thinking in java)
- 批处理获取当前路径
- RPG与设计模式(一)装饰模式
- eclipse安装pydev不成功
- 最后的善良
- 引用第三方jar中class,不可不知的java.lang.NoSuchMethodError
- mysql 多表更新数据 更新新字段的数据很有用
- SOCI的编译注意事项(通过oracle, mysql, sqlite, boost)
- 第十七章--回收页框