A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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的特点在上一篇帖子有总结。

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

11 个回复

倒序浏览
赞一个  写的很全面
回复 使用道具 举报 1 0
xiao15779706 发表于 2015-11-20 09:26
赞一个  写的很全面

谢谢谢谢噶
回复 使用道具 举报

确实是一个很全面  面试也容易问到的问题  虽然简单 确实很好
回复 使用道具 举报
这波很关键
回复 使用道具 举报
膜拜大神
回复 使用道具 举报
技术型水贴。。。。。哈哈
回复 使用道具 举报
先看一个栗子吧?  错别字要改正   要严谨
回复 使用道具 举报
你是对的 发表于 2015-11-20 22:09
技术型水贴。。。。。哈哈

哈哈,还没放大招呢
回复 使用道具 举报
一江夜雨 发表于 2015-11-20 22:40
先看一个栗子吧?  错别字要改正   要严谨

这是网络用语哩
回复 使用道具 举报
oup 中级黑马 2015-11-20 23:14:54
11#
大神深入理解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马