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]
数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列