java作为面向对象的语言,给广大使用java语言进行开发的程序源提供了强大的api支持,那么我们在创建一个新的对象时,内部会做一些什么操作呢?
首先作为一个合格的程序猿要知道什么时候才会创建对象,创建对象的前提必须是类要加载之后才能创建对象,这里就有一个疑问了类是怎么加载的?
类怎么加载就要明白它是利用了什么进行加载,java的类加载是使用类加载器(ClassLoder)加载类,类加载器顾名知意就是加载类的,那么他是如何工作的
类的加载是通过jvm加载的,分为三个步骤:装载(Load),链接(link)和初始化(initializa),链接又分为三个步骤如下图所示:
1) 装载:查找并加载类的二进制数据;
2)链接:
验证:确保被加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3)初始化:为类的静态变量赋予正确的初始值;
现在弄清楚了类加载那么就来说一下在new 一个对象底层会做一些什么事情
1、jvm加载未加载的字节码,开辟空间
2、静态初始化
3、成员初始化
4、构造器初始化
代码演示
class Person{
static{
system.out.println("这是静态代码块");
}
public static int age=3333;
{
system.out.println("这是普通代码块");
}
public int Age=222;
public Person(){
system.out.println("构造器")
}
}
以上代码会打印:
这是静态代码块
333
这是普通代码块
222
构造器
如果这个类有父类那么就会先初始化父类静态,子类静态之后初始化父类普通成员构造最后再初始化子类普通成员与构造
代码演示:
static{
system.out.println("这是父类静态代码块");
}
public static int age=3333;
{
system.out.println("这是父类普通代码块");
}
public int Age=222;
public Person(){
system.out.println("构造器")
}
}
class Chinese extends Person{
static{
system.out.println("这是子类静态代码块");
}
public static int age=222;
{
system.out.println("这是子类普通代码块");
}
public int Age=3333;
public Chinese(){
system.out.println("这是子类构造器");
}
通过测试发现打印效果如下:
这是父类静态代码块
这是子类静态代码块
这是父类普通代码块
这是父类构造器
这是子类普通代码块
这是子类构造器
注:在这两个例子中都有静态变量跟普通变量,例子中都没打印,但是我们也要清楚在静态初始化完成以后就会初始化普通的成员变量最后才会执行构造
通过以上例子总结出来在使用new关键字时并不像其表面的那么简单,在其背后还隐藏着一些被忽略或不被知道的操作。。。。。。。