new一个新对象的过程
1、虚拟机遇到new指令,到常量池定位到这个类的符号引用。
2、检查符号引用代表的类是否被加载、解析、初始化过。
3、虚拟机为对象分配内存。
4、虚拟机将分配到的内存空间都初始化为零值。
5、虚拟机对对象进行必要的设置。
6、执行方法,成员变量进行初始化。
7、将对象的引用指向这个内存区域
我们把这个过程简化一下,简化成3个步骤:
a、JVM为对象分配一块内存M (分配内存)
b、在内存M上为对象进行初始化 (初始化)
c、将内存M的地址复制给s变量(赋值)
创建对象初始化的顺序
创建对象初始化的顺序如下:
父类静态成员(包括方法和变量,按顺序初始化)
子类静态成员(包括方法和变量,按顺序初始化)
父类成员变量(包括非静态代码块)
父类构造方法
子类成员变量(包括非静态代码块)
子类构造方法
// 主类,用来创建子类对象,验证我们的结果
public class Main {
public static void main(String[] args) {
new Son();
}
}
// 普通类,用于测试对象成员变量
class Book{
public Book(String user){
System.out.println(user + "成员变量");
}
}
// 子类
class Son extends Father{
static Book book= new Book("子类静态");
static{
System.out.println("子类静态代码块");
}
Book sBook = new Book("子类");
{
System.out.println("子类非静态代码块");
}
public Son(){
System.out.println("子类构造方法");
}
}
// 父类
class Father{
static Book book= new Book("父类静态");
static{
System.out.println("父类静态代码块");
}
Book fBook = new Book("父类");
{
System.out.println("父类非静态代码块");
}
public Father(){
System.out.println("父类构造方法");
}
}
执行结果:
//父类静态成员变量
//父类静态代码块
//子类静态成员变量
//子类静态代码块
//父类成员变量
//父类非静态代码块
//父类构造方法
//子类成员变量
//子类非静态代码块
//子类构造方法