先看如下代码:

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方法入栈(进入方法执行堆栈区)箭头①方法入栈。

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

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

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

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

最新文章

  1. redis python-redis 安装详细步骤
  2. C# Enum Type
  3. Angular学习(7)- 模板
  4. npm命令大全
  5. JS的replace方法【转】
  6. Journey of Android for Mac
  7. Struts2+JQuery发送Ajax请求
  8. HTTP协议具体解释
  9. EF 事务处理 (InnoDB Engine的MySQL表也可以)
  10. URAL 1725. Sold Out!(数学啊 )
  11. RMIC命令提示找不到类的问题
  12. 设计模式的征途—5.原型(Prototype)模式
  13. hibernate3 和hibernate4的一点小变动
  14. Android - 多语言自动适配
  15. spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
  16. 使用Promise发送多个异步请求, 全部完成后再执行
  17. Linux下部署Samba服务环境的操作记录
  18. C#编程(七十一)---------- 自定义特性
  19. mybatis 3.2.*打印sql结果集
  20. (惊艳)hashmap的理解(映射)

热门文章

  1. 去除 chrome 上保存密码后的 input 框的屎黄色背景
  2. Go - WaitGroup
  3. Galaxian 小蜜蜂
  4. jmeter的简单http接口用法
  5. jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)
  6. mongdb 报错“Cannot connect to the MongoDB at 192.179.1.6:27017. Error: Network is unreachable.”
  7. 【配置阿里云 I】申请配置阿里云服务器,并部署IIS和开发环境,项目上线经验
  8. 双网卡单IP实现网卡冗余与负载均衡
  9. List Leaves
  10. 决策树(decision tree)