对象的初始化顺序
类在整个代码执行期间,只会被加载一次;由于静态变量是属于类的,所以静态变量也只会被初始化一次(加载类的时候,就要加载静态变量)
对象的实例化顺序:
1.加载(也称初始化)静态变量和静态代码块(静态代码块和静态变量按照定义的顺序自上而下执行) 静态部分只执行一次
2.加载(初始化)成员变量和代码块(代码块和成员变量按照定义的顺序自上而下执行)
(每次new对象时,代码块执行在构造方法前,如先定义成员变量,代码块执行在其后;先定义代码块,代码块执行在前)
3.执行构造方法
有父类的情况下
1.先加载父类中的静态部分
2.再加载子类中的静态部分
3.加载父类中的代码块、成员变量
4.加载父类中的构造方法
5.加载子类中的代码块、成员变量
6.加载子类中的构造方法
class Single{
static int i;
{
//代码块
System.out.println("代码块");
i++;
}
int a = a();
static int b = b();
static {
System.out.println("静态代码块");
i++;
}
int a() {
System.out.println("初始化成员变量");
i++;
return 10;
}
static int b() {
System.out.println("初始化静态变量");
i++;
return 100;
}
public Single(){
System.out.println("构造方法");
i++;
}
public final void tt() {}
}
class SubSingle extends Single{ //若父类final class Single{},此处 Single报错
// public void tt() { } 报错
{System.out.println("代码块1");}
int aa = aa();
static int bb = bb();
static {System.out.println("静态代码块1");}
int aa() {
System.out.println("初始化成员变量1");
return 10;
}
static int bb() {
System.out.println("初始化静态变量1");
return 100;
}
public SubSingle(){System.out.println("构造方法1");}
}
public class MyProcess {
public static void main(String[] args) {
//final int a = 10;
//a = 100; (报错 此处a已为常量,不可再赋值更改)
Single s1 = new Single(); //i=5
System.out.println("----------");
Single s2 = new Single(); //i=8 (第二次静态代码块和静态变量不再初始化执行)
System.out.println("----------");
new SubSingle(); //new SubSingle();为创建对象,将其赋给一个变量方便后续使用,若只需打印,直接new即可
}
}