1 初始化

1.1 构造器初始化:构造器采用与类相同的名称,默认构造器(也叫无参构造器),有参构造器;

    如果一个类中提供了有参数构造器,没有显示的提供默认构造器的话,那么此时初始化无参构造器会出现编译时错误,如果还想使用无参构造器就需要显示的提供无参构造器。

    构造器是一种特殊类型的方法,没有返回值,但这和返回值为空(void)明显不同,对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西。构造器则不会返回任何东西,尽管使用new表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值。

    编写构造器中的一条准则:尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法,在构造器内唯一能够调用的那些方法应该是基类中的final方法,也包括private方法(得出与构造器内部的多态行为)。

    基类的构造器总是在到处类的构造过程中被调用,并且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用,构造器用于检查对象是否被正确的地构造。在存在继承的类中初始化一般要遵循以下顺序:

    a 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零(体现在构造器内部的多态方法行为);

    b 调用基类构造器,这个步骤会不断的反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最底层的导出类;

    c 按照声明顺序调用成员的初始化方法;

    d 调用导出类构造器的主体 

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

package com.javademo.init;

class Window{
    Window(int marker){
        System.out.println("Window("+marker+")");
    }
}
class Hourse{
    Window w1 = new Window(1);//2
    Hourse(){//5
        System.out.println("Hourse()");//6
        w3 = new Window(33);//7
    }
    Window w2 = new Window(2);//3
    void f(){
        System.out.println("f()");
    }
    Window w3 = new Window(3);//4
}
public class OrderOfInitialization {
    public static void main(String[] args){
        Hourse h = new Hourse();//1
        h.f();//8
    }
}

//Output
Window(1)
Window(2)
Window(3)
Hourse()
Window(33)
f()

        2)静态数据的初始化,无论创建多少个对象,静态数据都只占用一份存储区域,static不能应用局部变量,只能作用于域。初始化顺序是先静态对象,后非静态对象,静态初始化只有在必要时刻才会进行,而后静态对象不会再次初始化。例如:

package com.javademo.init;

class Window{
    static {
        System.out.println("Window static");
    }
    Window(int marker){
        System.out.println("Window("+marker+")");
    }
}
class Hourse{
    Window w1 = new Window(1);
    Hourse(){
        System.out.println("Hourse()");
        w3 = new Window(33);
    }
    Window w2 = new Window(2);
    void f(){
        System.out.println("f()");
    }
    Window w3 = new Window(3);
    static Window w4 = new Window(4);
}
public class OrderOfInitialization {
    public static void main(String[] args){//2再执行
        System.out.println("OrderOfInitialization main start");
        Hourse h = new Hourse();
        h.f();
        System.out.println("OrderOfInitialization main end");
    }
    static Hourse hourse = new Hourse();//1先执行
}
//Output
Window static//执行一次
Window(4)//执行一次
Window(1)
Window(2)
Window(3)
Hourse()
Window(33)
OrderOfInitialization main start
Window(1)
Window(2)
Window(3)
Hourse()
Window(33)
f()
OrderOfInitialization main end

 3)显示的静态初始化,java允许将多个静态初始化动作组织成一个特殊的“静态子句”,这种方式和其他静态初始化动作一样,仅执行一次。

    4)非静态实例初始化,和静态初始化一样,只是缺了static关键字,初始化顺序在静态实例之后。

    5)数组初始化 int[] i = {1,2,3,4}  int[] n = new int[5]

       数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列