zoukankan      html  css  js  c++  java
  • Java对象的初始化过程解析

    先看如下代码:

    Person.java

    public class Person {
        
        private String name;
        private int age;
    
        static int count = 0;
        
        public Person() {
            
        }
        
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        
        public void sayHi() {
            System.out.println("姓名:"+this.name+",年龄:"+this.age);
        }
        
    }

    TestPerson.java

    public class TestPerson {
        public static void main(String[] args) {
            Person person = new Person("kallen",20);
            person.sayHi();
        }
    }

    对象初始化步骤:

    1. 虚拟机加载TestPerson类(包含准备,链接,初始化),提取类型信息(包含计算申请多大堆空间等),存储到方法区。

    2. 通过保持在方法区的字节码(.class) 虚拟机开始执行main方法,main方法入栈(进入方法执行堆栈区)箭头①方法入栈。

     

    11

    3. 进入main方法的第一条指令,new Person("kallen",20);虚拟机看到new 就知道要分配空间了,去方法区找Person类,没找到就装载Person类,并把Person类的类型信息存储到方法区。

    通过存储在方法区中Person 类的类型信息确定了实例对象需要分配的空间大小,在堆区分配指定大小的内存,并把实例对象的成员变量初始化为默认值(int初始化为0,引用变量初始为null)。此时,实例对象的内存分配完毕。这是new操作符的第一步。

    22

     

    new操作的第二步开始执行,调用构造方法,完成对象的初始化工作。然后把对象在堆空间的地址赋值给引用类型变量person。整条Person person = new Person("kallen",20);指令执行完成。

    33

    4. 调用sayHi(),通过person持有的引用,找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类(Person)的类型信息,然后定位到sayHi方法,sayHi方法入栈,开始执行方法中的字节码。图中箭头④调用方法。

    44

  • 相关阅读:
    线程安全-003-对象锁的同步和异步
    线程安全-002-多个线程多把锁&类锁
    线程安全-001
    FastDFS单节点安装
    Nginx+Keepalived 实现高可用
    linux下配置nginx负载均衡例子
    linux下配置nginx反向代理例子
    Linux命令
    nginx配置文件 nginx.conf 说明
    CentOS安装Nginx 以及日志管理
  • 原文地址:https://www.cnblogs.com/geeta/p/9121170.html
Copyright © 2011-2022 走看看