Java虚拟机创建对象的过程Demo(二)
声明:此篇文章只讲述Demo,用案例来证明,若不清楚创建对象的过程请看我之前的文章:
Java虚拟机(一)Java虚拟机(二)Java虚拟机(三)
package object;
/**
* 验证创建对象的过程
*
* @author TongWei.Chen
* @date 2016年12月21日09:26:31
*/
public class CreateObjDemo02 {
public static void main(String[] args) {
Person person = new Person("TongWei.Chen", 22);
person.setName("TongWei");
person.show();
}
}
class Person {
private String name;
private int age;
private static String Country = "CN";
DemoTest demo = new DemoTest();
public Person(String name, int age) {
System.out.println("这是Person的构造器");
this.name = name;
this.age = age;
}
{
System.out.println("这是Person的构造代码块");
}
static {
System.out.println("这是Person的静态代码块");
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("name = " + name + "::"+"age = " + age);
}
public static void showCountry() {
System.out.println("Country = " + Country);
}
}
class DemoTest {
public DemoTest() {
System.out.println("这是一个测试的类");
}
}
上述程序结果为:
这是Person的静态代码块
这是一个测试的类
这是Person的构造代码块
这是Person的构造器
name = TongWei::age = 22
分析:
1、首先区方法区中找有没有类的信息,没有的话首先进行加载、解析、初始化操作。(这时候System.out.println("这是Person的静态代码块");这句话就被执行了)
2、为对象分配内存空间,并按顺序执行。(这时候System.out.println("这是一个测试的类");被执行)
3、进行构造代码块的初始化,构造代码块优先级高于构造器。(这时候System.out.println("这是Person的构造代码块");被执行)
4、进行构造器的执行。(这时候System.out.println("这是Person的构造器");被执行)
5、将堆内存中的对象赋给栈中的person。
6、首先在栈中为对象的引用person开辟一块空间,然后定位到person对应的堆中的Person对象,在根据持有的引用person定位到方法区中的setName方法。输出name = TongWei::age = 22
好资源啊,谢谢分享
页:
[1]