java static数据的初始化
2010-11-25 11:04
218 查看
无论创建多少对象,static数据都只只用一份存储区域。static关键字不能应用于局部变量,因此他只能这用于域。如果一个域是基本类型,并且没有给它初始化,那么他会默认为基本类型的标准初始值;如果是一个引用,那么他会默认为初始值null。
想要了解静态域是如何初始化的,请看下面的例子。
package initialization;
//: initialization/StaticInitialization.java
// Specifying initial values in a class definition.
import static net.mindview.util.Print.*;
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
print("Creating new Cupboard() in main");
new Cupboard();
print("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
/* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/
Bowl类使得看到类的创建,而Table类和Cupboard类在他们的类中分别定义了Bowl类的static成员对象。注意在定义静态数据成员之前,Cupboard类先定义了一个Bowl类型的非静态成员bowl3。
由此可见静态数据只有在必要时才进行初始化。如果不创建Table对象,也不引用Talbe的bowl1和bowl2,那么Talbe的bowl1和bowl2永远都不会被创建。只有在第一个Talbe被创建时或第一次访问其中的Bowl类型的静态成员时,他们才会被初始化。此后静态数据不会在被初始化。
通过上面的事例可以总结:在创建一个类时,初始化的顺序是先是静态数据,并且仅初始化一次(如果它们尚未因前面对象的创建或某些动作的执行未被初始化),而后是非静态数据(每次在创建时都会初始化),然后是构造函数。
另外直接用类名调用静态数据和静态方法时,这个类中的所以静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。
从结果中可以观察到这一点。要执行main()(stati方法),必须加载StaticInitialization类,然后是StaticInitialization 类中的sataic成员table 和cupboard 的初始化,这将导致Tabel和Cupboard 类中的静态数据也会被初始化。这样在main()未开始之前,所有对象已经被初始化。然而在main()方法在执行创建Cupboard 类对象时,Cupboard 中的static数据不会再被初始化,因为static数据已经在main()之前已经被第一次初始化。
想要了解静态域是如何初始化的,请看下面的例子。
package initialization;
//: initialization/StaticInitialization.java
// Specifying initial values in a class definition.
import static net.mindview.util.Print.*;
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
print("Creating new Cupboard() in main");
new Cupboard();
print("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
/* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/
Bowl类使得看到类的创建,而Table类和Cupboard类在他们的类中分别定义了Bowl类的static成员对象。注意在定义静态数据成员之前,Cupboard类先定义了一个Bowl类型的非静态成员bowl3。
由此可见静态数据只有在必要时才进行初始化。如果不创建Table对象,也不引用Talbe的bowl1和bowl2,那么Talbe的bowl1和bowl2永远都不会被创建。只有在第一个Talbe被创建时或第一次访问其中的Bowl类型的静态成员时,他们才会被初始化。此后静态数据不会在被初始化。
通过上面的事例可以总结:在创建一个类时,初始化的顺序是先是静态数据,并且仅初始化一次(如果它们尚未因前面对象的创建或某些动作的执行未被初始化),而后是非静态数据(每次在创建时都会初始化),然后是构造函数。
另外直接用类名调用静态数据和静态方法时,这个类中的所以静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。
从结果中可以观察到这一点。要执行main()(stati方法),必须加载StaticInitialization类,然后是StaticInitialization 类中的sataic成员table 和cupboard 的初始化,这将导致Tabel和Cupboard 类中的静态数据也会被初始化。这样在main()未开始之前,所有对象已经被初始化。然而在main()方法在执行创建Cupboard 类对象时,Cupboard 中的static数据不会再被初始化,因为static数据已经在main()之前已经被第一次初始化。
相关文章推荐
- 编写Java程序,模拟简单的计算器。 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。 编写构造方法,用于初始化n1和n2,再为该类定义 加(addition)、 减(su
- 了解Java的类装载器(static什么时候初始化)
- java学习(2)数组详解(包括数据的初始化、比较、排序、重要方法)
- Java final和static字段的初始化详解
- JAVA中初始化数据的方法?
- Java数据初始化的问题
- 为什么static数据成员一定要在类外初始化?
- java学习笔记 类初始化 调用static变量是否会初始化
- C++的类 (新增 static成员数据初始化,纯虚函数,抽象类)
- Thinking in Java之静态数据初始化顺序
- java静态数据的初始化
- 大数据Java基础系列-static关键字
- 深入java static关键字 浅析java类加载机制(解答java静态方法或变量无法访问非静态数据)
- 这道java关于static和类加载初始化的面试题(很经典)
- [Think in java]静态数据的初始化
- java数据的初始化
- static 静态数据的初始化
- java中static变量与非static变量初始化顺序
- p95 静态数据初始化 thinking in java 4
- StaticCodeDemo.java:29: 错误: 方法声明无效; 需要返回类型 person(){//给对应的对象进行针对性的初始化。