java中的初始化
1.初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍然会在任何方法(包括构造器)被调用之前得到初始化。下面看个例子就明白了:
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 Test
{
public static void main(String[] args){
Card t = new Card();
t.f();
}
}
执行结果:
Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()
说明:在main函数中首先创建了一个Card对象,在Card类的定义中有三个变量,分别是t1,t2,t3。虽然它们在类中的定义很分散,但是在对象被创建时,首先要初始化这些对象,所以输出的结果中,先输出Tag(1),Tag(2),Tag(3)。之后才是构造函数,最后才是方法。所以结果很容易理解了。注意此处的t3被初始化了两次。
2.静态数据的初始化
如果是静态数据,情况是相同的。只是有一点,无论创建多少个对象,静态数据都只占用一份存储区域,也就是说只初始化一次。下面看个例子:
class Bow1
{
Bow1(int marker){
System.out.println("Bow1("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
};
class Table
{
static Bow1 b1 = new Bow1(1);
Table(){
System.out.println("Talbe()");
b2.f(1);
}
void f2(int marker){
System.out.println("f1("+marker+")");
}
static Bow1 b2 = new Bow1(2);
};
class Cupboard
{
Bow1 b3 = new Bow1(3);
static Bow1 b4 = new Bow1(4);
Cupboard(){
System.out.println("Cupboard");
b4.f(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bow1 b5 = new Bow1(5);
};
public class Test1
{
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();
};
执行结果有点长,自己执行一下就知道了。还是说明一下吧!
创建Test1类时,首先要为它的变量分配存储空间。而这两个变量又是静态对象,先为t2分配空间,t2是个Table类,而Table类里又有两个静态变量,所以先为这两个变量分配,所以到此执行的结果为:Bow1(1),Bow1(2),Table(),f(1),然后是为t3对象分配空间。最后执行main函数。因为在为t3分配空间时,b3和b4已经初始化过一次了,所以执行new Cupboard()时,就不用再执行static Bow1 b4 = new Bow1(4); 和static Bow1 b5 = new Bow1(5);了。可以自己执行一下试试。
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍然会在任何方法(包括构造器)被调用之前得到初始化。下面看个例子就明白了:
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 Test
{
public static void main(String[] args){
Card t = new Card();
t.f();
}
}
执行结果:
Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()
说明:在main函数中首先创建了一个Card对象,在Card类的定义中有三个变量,分别是t1,t2,t3。虽然它们在类中的定义很分散,但是在对象被创建时,首先要初始化这些对象,所以输出的结果中,先输出Tag(1),Tag(2),Tag(3)。之后才是构造函数,最后才是方法。所以结果很容易理解了。注意此处的t3被初始化了两次。
2.静态数据的初始化
如果是静态数据,情况是相同的。只是有一点,无论创建多少个对象,静态数据都只占用一份存储区域,也就是说只初始化一次。下面看个例子:
class Bow1
{
Bow1(int marker){
System.out.println("Bow1("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
};
class Table
{
static Bow1 b1 = new Bow1(1);
Table(){
System.out.println("Talbe()");
b2.f(1);
}
void f2(int marker){
System.out.println("f1("+marker+")");
}
static Bow1 b2 = new Bow1(2);
};
class Cupboard
{
Bow1 b3 = new Bow1(3);
static Bow1 b4 = new Bow1(4);
Cupboard(){
System.out.println("Cupboard");
b4.f(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bow1 b5 = new Bow1(5);
};
public class Test1
{
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();
};
执行结果有点长,自己执行一下就知道了。还是说明一下吧!
创建Test1类时,首先要为它的变量分配存储空间。而这两个变量又是静态对象,先为t2分配空间,t2是个Table类,而Table类里又有两个静态变量,所以先为这两个变量分配,所以到此执行的结果为:Bow1(1),Bow1(2),Table(),f(1),然后是为t3对象分配空间。最后执行main函数。因为在为t3分配空间时,b3和b4已经初始化过一次了,所以执行new Cupboard()时,就不用再执行static Bow1 b4 = new Bow1(4); 和static Bow1 b5 = new Bow1(5);了。可以自己执行一下试试。
 
                    
                     
                    
                 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号