对象在创建的时候都发生了什么?
2015-12-25 15:34
302 查看
我们知道一个类可以有很多部分组成,构造函数,静态方法、静态成员变量,成员变量,构造代码块,局部代码块,静态代码块。那么类在加载进内存并且创建对象时都发生了什么,又都有什么顺序呢?
先看一个栗子吧:
class Person
{
private
String name;
private
int age = 18;
private
static String country = "CN";
public
static void print()
{
System.out.println(country);
}
static
{
System.out.println("haha");
}
{
System.out.println(name+","+age+","+country);
}
public
Person(String name)
{
this.name = name;
System.out.println(name);
}
}
class TestPerson
{
public
static void main(String[] args)
{
Person p = new Person("Aaron");//What happened here?
}
}
如果对对象的建立过程熟悉的话,答案还是很容易得出的:
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的特点在上一篇博客有总结
。
先看一个栗子吧:
class Person
{
private
String name;
private
int age = 18;
private
static String country = "CN";
public
static void print()
{
System.out.println(country);
}
static
{
System.out.println("haha");
}
{
System.out.println(name+","+age+","+country);
}
public
Person(String name)
{
this.name = name;
System.out.println(name);
}
}
class TestPerson
{
public
static void main(String[] args)
{
Person p = new Person("Aaron");//What happened here?
}
}
如果对对象的建立过程熟悉的话,答案还是很容易得出的:
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的特点在上一篇博客有总结
。
相关文章推荐
- [置顶] iOS 中 Storyboard 与 Xib 间控制器跳转 - 简化整理完整版
- static关键字
- 庆丰包子铺自助点餐系统
- java万年历小程序
- 今天在做登录的时候,发现回车登录有问题
- instance variables may not be placed in categories
- 《Head First 设计模式》观后感——专业并不一定是深奥和枯燥
- 从 Program Manager 看 Leader 是什么角色
- AngularJS 表单
- Python -- 两个列表的差集、并集和交集
- oracle 存储过程的基本语法 及注意事项 (转)
- MySQL事务以及select...for update
- 进度条ProgressCtrl设置
- 数据结构课程设计—学生信息管理系统
- 正则表达式 模式修正
- LED驱动程序的makefile文件
- How to create a customized field value by executing PHP code
- Spark RDD API详解(一) Map和Reduce
- hadoop跑第一个实例过程
- SMSLib开发指南