关于对象的实例化过程:
1.检查类是否加载,如果没有加载就加载这个类,要加载所有父类;
懒式加载(按需加载):如果第一次用到加载,只加载一下.通过ClassPath制定的路径寻找类文件(.class) 加载以后是一个对象,类型是class.获得这个类对象:student.class-->class实例
2.在内存堆中分配对象空间.递归分配所有父类和子类属性空间.先父类型再子类型,属性默认自动初始化.自动初始化为"0"值;
3.进行属性的赋值;
4.递归调用父类构造器.(默认调用父类无参构造器);
5.调用本类构造器
其实面试过程中有很多类似的考题,考的都是初始化的顺序;首先要弄清楚以下几个概念:
1.静态初始化是指执行静态初始化块里面的内容;
2.实例初始化是指执行实例初始化块里的内容;
3.构造方法:一个名称跟类的名称一样的方法,特殊在于不带返回值;
给出以下代码,方便理解:
public class TestInstanceInit {
public static int n = 0;// 静态变量
static {// 这是静态初始化块
print();
System.out.println("this is static block");
}
{// 实例初始化块
System.out.println(n);
}
public TestInstanceInit() {// 构造方法
System.out.println("this is TestInstanceInit's constructor~");
}
public static void print() {// 静态方法
System.out.println("this is static method~");
System.out.println(n);
n += 1;
}
public static void main(String[] args) {
new TestInstanceInit();
}
}
控制台输出结果:
this is static method~
0
this is static block
1
this is TestInstanceInit's constructor~
如果有一个变量怎么处理呢:
public class TestInstanceInit {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public TestInstanceInit() {
System.out.println("构造器");
}
public static void main(String[] args) {
new TestInstanceInit();
}
}
静态变量
静态初始化块
变量
初始化块
构造器
总结如下:
执行顺序
(静态变量、静态初始化块)>(变量、初始化快)>构造器
静态变量和静态初始化快/变量和初始化快的先后顺序取决于它们在类中出现的先后顺序