/*    
 *初始化全过程:    
 *    
 *1,    第一次创建MyClass类的对象,或者第一次访问MyClass的static方法或字段时,Java解释器会搜寻classpath,找到MyClass.class。    
 *2,    装载MyClass.class后,会对所有的static数据进行初始化。这样第一个装载Class对象的时候,会先进行static成员的初始化。    
 *3,    使用new MyClass()创建新对象的时候,MyClass对象的构建进程会先在堆里为对象分配足够的内存。 *    
 *4,    清零这块新内存,把MyClass对象的primitive类型的成员赋上缺省值。    
 *5,    执行定义成员数据时所作的初始化。     
 *6,    执行构造函数。    
 */     
import static net.mindview.util.Print.*;      
     
public class Beetle extends Insect      
{      
    private int k = printInit("Beetle.k initialized");      
     
    public Beetle()      
    {      
        print("k = " + k);      
        print("j = " + j);      
    }      
    private static int x2 = printInit("static Beetle.x2 initialized");      
     
    public static void main(String[] args)      
    {      
        print("Beetle constructor");      
        Beetle b = new Beetle();      
    }      
}      
     
class Insect      
{      
    private int i = 9;      
    protected int j;      
     
    Insect()      
    {      
        print("i = " + i + ", j = " + j);      
        j = 39;      
    }      
     
    private static int x1 = printInit("static Insect.x1 initialized");      
     
    static int printInit(String s)      
    {      
        print(s);      
        return 47;      
    }      
}      
     
     
/* Output:    
static Insect.x1 initialized    
static Beetle.x2 initialized    
Beetle constructor    
i = 9, j = 0    
Beetle.k initialized    
k = 47    
j = 39    
*///:~      
     
/****************************************************/     
     
// 变量初始化先后顺序的示例      
import static net.mindview.util.Print.*;      
     
//当创建Window的实例对象时会有消息提示      
class Window      
{      
    Window(int marker)      
    {      
        print("Window(" + marker + ")");      
    }      
}      
     
class House      
{      
    Window w1 = new Window(1); // 构造函数前的变量      
     
    House()      
    {      
        //构造函数里面的变量      
        print("House()");      
        w3 = new Window(33); // 重新赋值w3      
    }      
     
    Window w2 = new Window(2); // 构造函数后的变量      
     
    void f()      
    {      
        print("f()");      
    }      
     
    Window w3 = new Window(3); // 结束类体时的对象      
}      
     
public class OrderOfInitialization      
{      
    public static void main(String[] args)      
    {      
        House h = new House();      
        h.f();       
    }      
}       
/*    
* 输出结果: Window(1) Window(2) Window(3) House() Window(33) f()    
*    
* 从结果看出,虽然域变量w2,w3排在构造函数后面,但它的输出却在构造函数前面    
*/     
     
/****************************************************/     
     
// 数组的初始化      
import java.util.*;      
     
public class ArrayInit      
{      
    public static void main(String[] args)      
    {      
        //直接赋值方式,局限在于数组在大小编译确定      
        Integer[] a = {       
                new Integer(1),       
                new Integer(2),       
                3, // 自动包装      
                };      
        //new方式,适于参数数量未知的场合,或者参数类型未知的场合      
        Integer[] b = new Integer[] {       
                new Integer(1),       
                new Integer(2),       
                3, // 自动包装      
                };      
        System.out.println(Arrays.toString(a));      
        System.out.println(Arrays.toString(b));      
    }      
}      
/* 输出结果:    
 [1, 2, 3]    
 [1, 2, 3]    
 *///:~    
Author: orangelizq
email: orangelizq@163.com
	posted on 2008-12-25 11:30 
桔子汁 阅读(376) 
评论(0)  编辑  收藏  所属分类: 
J2SE