NullPointer 发表于 2016-12-21 10:16

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

随心随遇 发表于 2016-12-21 12:50

好资源啊,谢谢分享
页: [1]
查看完整版本: Java虚拟机创建对象的过程Demo(二)