Java的初始化类、变量、程序块加载探讨

1.基本类型数据的初始值

InitialValues.java

public class InitialValues {boolean t;char c;byte b;short s;int i;long l;float f;double d;void print(String s) {System.out.println(s);}void printInitialValues() {print("boolean " + t);print("char " + c);print("byte " + b);print("short " + s);print("int " + i);print("long " + l);print("float " + f);print("double " + d);}public static void main(String[] args) {InitialValues iv = new InitialValues();iv.printInitialValues();}}

结果:

boolean falsechar _byte 0short 0int 0long 0float 0.0double 0.0

2.变量初始化

在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧在任何方法(包括构造器)被调用之前得到初始化。看下面的代码:

OrderOfInitialzation.java(执行顺序在代码中已标出,按类标注,罗马字母标注主类中执行顺序。)

class Tag {Tag(int marker) {System.out.println("Tag(" + marker + ")");}}class Card {Tag t1 = new Tag(1);// Ⅰ①Card() {System.out.println("Card()");// Ⅰ④t3 = new Tag(33);// Ⅰ⑤}Tag t2 = new Tag(2);// Ⅰ②void f() {System.out.println("f()");// Ⅱ⑥}Tag t3 = new Tag(3);// Ⅰ③}public class OrderOfInitialzation {public static void main(String[] args) {Card t = new Card();// Ⅰt.f();// Ⅱ}}

结果:

Tag(1)Tag(2)Tag(3)Card()Tag(33)f()

3.静态数据初始化

看下面的代码:

StaticInitialization .javaclass 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(1)Bowl(2)Table()f(1)Bowl(4)Bowl(5)Bowl(3)Cupboardf(2)Creating new Cupboard() in mainBowl(3)Cupboardf(2)Creating new Cupboard() in mainBowl(3)Cupboardf(2)f2(1)f3(1)

由输出可见,静态初始化只有在必要时刻才会进行。如果不创建Table 对象,也不引用Table.b1或Table.b2,那么静态的Bowl b1 和b2 永远都不会被创建。只有在第一个Table 对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。

初始化的顺序是先“静态”,(如果它们尚未因前面的对象创建过程而被初始化),后“非静

望着它们,我睡着了。今天已经过去——我生命中所有天中的一天,

Java的初始化类、变量、程序块加载探讨

相关文章:

你感兴趣的文章:

标签云: