package com.qhf.day012;
public class ObjectCreateProcess02 {
public static void main(String[] args) {
new B();
System.out.println("-----");
new B();
}
}
class A{
A(){
System.out.println("A构造");//8,构造方法和成员变量先后
}
int a1 = 1;//7,new了对象后执行分配成员变量的内存空间
//2.静态代码块,3.静态变量赋值和静态代码块先后取决于代码先后
static {
int aa = 9;//静态代码块执行完就消失
System.out.println("A的静态代码块"+aa);
}
static int a2 = 2;//1,分配父类静态变量空间,还没赋值。
}
class B extends A{
int b1 = 1;
static int b2 = 2;//4
static {
System.out.println("B的静态代码块");//5,6
}
B(){
System.out.println("B构造");
}
}
class C {
int c = 10;//成员变量可以定义在含此变量名的构造代码块前面
{
int c = 9;
System.out.println("构造代码块。。" + c);
}
public C() {
System.out.println("C构造方法。。");
//int c1 = 1;//c1变量定义在含声明c1局部代码块前面,报错
{
System.out.println("局部代码块。。");
int c1 = 2;
}
int c1 = 3;
}
}
对于C 类,单独运行发现:
声明成员变量和含声明同名变量的构造代码块执行顺序,new 了类之后先声明成员变量,为成员变量分配空间,然后对成员变量的赋值取决于它与构造代码块的先后顺序。而且构造代码块中也可以声明c变量,这个很神奇。
对于局部代码块来说,执行顺序就是代码的顺序,所以与构造代码块不同,变量声明不能写在含声明同名变量的局部代码前面。