创建对象的内存及流程分析(部分转载)
在java中提倡万物皆对象的思想,所以对于创建一个对象时的内存分析显得很有必要
java中程序运行流程
java程序运行分为两个流程,分别为编译和执行,在编译阶段java编译器将源代码解释成字节码(即class文件),然后由JVM进行运行class文件
下面的对象的创建是指的是运行期间的操作
对象创建的流程分析
- 由new关键字发出开辟堆内存空间的指令,并返回所开辟空间的地址
一个对象的创建分为4步
在对象初始化之前进行类的加载加载检查, 在类的加载过程中,类的static成员变量会被初始化,另外,如果类中有static语句块,则会执行static语句块。static成员变量和static语句块的执行顺序同代码中的顺序一致。记住,在Java中,类是按需加载,只有当需要用到这个类的时候,才会加载这个类,并且只会加载一次。看下面这个例子就明白了:
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Bread bread1 = new Bread();
Bread bread2 = new Bread();
A a=new A();
}
}
class Bread {
static{
System.out.println("Bread is loaded");
}
public Bread() {
System.out.println("bread");
}
}
class A{
static {
System.out.println("hello");
}
}
output:
Bread is loaded
bread
bread
hello
-
分配对象空间,并将对象成员变量初始化为0或为空, 执行属性值的显示初始化
-
执行构造方法
-
返回对象的地址给相关变量
-
对象的内存分析
先完成类的加载(包含对static属性和方法的加载,也包含对main函数的加载)然后再执行