java静态数据的初始化
来源:互联网 发布:淘宝好评兼职 编辑:程序博客网 时间:2024/05/21 10:37
举一个例子:
Bowl类
class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}Table类
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);}Cupboard类
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);}StaticInitialization类
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(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 对象。大家可从输出结果中找到相应的证据。
在这里有必要总结一下对象的创建过程。请考虑一个名为 Dog的类:
(1) 类型为 Dog的一个对象首次创建时,或者Dog 类的static方法/static 字段首次访问时,Java 解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class 后(它会创建一个 Class对象),它的所有 static初始化模块都会运行。因此,static初始化仅发生一次——在 Class 对象首次载入的时候。
(3) 创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个 Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及 boolean和char 的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。这实际可能要求进行相当多的操作,特别是在涉及继承的时候。
PS: java编程思想读书笔记
- java静态数据的初始化
- [Think in java]静态数据的初始化
- 静态数据的初始化
- 静态数据的初始化
- 静态数据的初始化
- 静态数据的初始化
- 静态数据的初始化
- 静态数据的初始化
- static 静态数据的初始化
- [Think in Java 笔记] 静态数据(Static data)的初始化
- JAVA编程思想(第4版) 静态数据的初始化
- Thinking in java 之:静态数据的初始化及初始化顺序
- Java基础知识—— 静态数据的初始化(含初始化顺序)
- Java静态块的初始化
- Java数组的静态初始化
- java数据的初始化
- 第七周 静态数据成员的初始化
- 关于静态数据的初始化顺序问题
- 查找
- Android MediaPlayer状态图明晰注释
- Linux netstat命令详解
- ajax无法执行success回调的原因分析
- css垂直居中的5中方法
- java静态数据的初始化
- Android数据库高手秘籍(三)——使用LitePal升级表
- 解析Android Widget开发实例
- 嵌入式 不同平台编译faac出错"mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’"
- vs code整段右移或者左移
- 关于java.lang.NoClassDefFoundError(更新)(Could not find or load main class)
- 字符串反转输出
- Android Audio系统之RingerMode
- JAVA 目录深度遍历 练习