黑马程序员技术交流社区

标题: 深度解析 对象在创建的时候都发生了什么?考前必看! [打印本页]

作者: Aaron_wang    时间: 2015-11-20 00:13
标题: 深度解析 对象在创建的时候都发生了什么?考前必看!
本帖最后由 Aaron_wang 于 2015-11-20 00:28 编辑

我们知道一个类可以有很多部分组成,构造函数,静态方法、静态成员变量,成员变量,构造代码块,局部代码块,静态代码块。那么类在加载进内存并且创建对象时都发生了什么,又都有什么顺序呢?

先看一个栗子吧:
  1. class Person
  2. {
  3.     private String name;
  4.     private int age = 18;
  5.     private static String country = "CN";

  6.     public static void print()
  7.     {
  8.         System.out.println(country);
  9.     }
  10.     static
  11.     {
  12.         System.out.println("haha");
  13.     }
  14.     {
  15.         System.out.println(name+","+age+","+country);
  16.     }
  17.    
  18.     public Person(String name)
  19.     {
  20.         this.name = name;
  21.         System.out.println(name);
  22.     }
  23. }
  24. class  TestPerson
  25. {
  26.     public static void main(String[] args)
  27.     {
  28.         Person p = new Person("Aaron");//What happened here?
  29.     }
  30. }
复制代码
如果对对象的建立过程熟悉的话,答案还是很容易得出的:
haha
null,18,CN
Aaron
整个过程其实可以分为如下几步:

*  Person p = new Person("Aaron");
*  1.对象的类文件加载进内存
*  2.静态成员(静态属性和静态方法),方法被调用才会执行------(country赋CN)
*  3.静态代码块(优先于对象),给类初始化------(打印haha)
*  4.对象开辟堆内存空间(分配内存地址)
*  5.在堆内存中建立对象的特有属性,进行默认初始化-----(name赋null,age赋0)
*  6.对属性进行显示初始化-----(age赋18)
*  7.构造代码块初始化,给对象初始化------(打印null,18,CN)
*  8.对对象进行对应的构造函数初始化
*  9.将内存地址赋值给栈内存的p变量

    上面就是整个Person类加载并创建对象的整个过程,可以看到静态总是优先于对象加载进内存的,他们所在的内存区域也有区别,静态static的特点在上一篇帖子有总结。
作者: xiao15779706    时间: 2015-11-20 09:26
赞一个  写的很全面
作者: Aaron_wang    时间: 2015-11-20 17:03
xiao15779706 发表于 2015-11-20 09:26
赞一个  写的很全面

谢谢谢谢噶
作者: xiao15779706    时间: 2015-11-20 18:25
Aaron_wang 发表于 2015-11-20 17:03
谢谢谢谢噶

确实是一个很全面  面试也容易问到的问题  虽然简单 确实很好
作者: 洋葱头头    时间: 2015-11-20 19:11
这波很关键
作者: championjx    时间: 2015-11-20 21:30
膜拜大神
作者: 你是对的    时间: 2015-11-20 22:09
技术型水贴。。。。。哈哈
作者: 一江夜雨    时间: 2015-11-20 22:40
先看一个栗子吧?  错别字要改正   要严谨
作者: Aaron_wang    时间: 2015-11-20 22:47
你是对的 发表于 2015-11-20 22:09
技术型水贴。。。。。哈哈

哈哈,还没放大招呢
作者: Aaron_wang    时间: 2015-11-20 22:48
一江夜雨 发表于 2015-11-20 22:40
先看一个栗子吧?  错别字要改正   要严谨

这是网络用语哩
作者: oup    时间: 2015-11-20 23:14
大神深入理解了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2