Person p = new Person("zhangsan",20)
该句话都做了什么事情?
1、因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中
2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3、在堆内存中开辟空间,分配内存地址。
4、在堆内存中建立对象的特有属性,并进行默认初始化。
5、对属性进行显式初始化。
6、对对象进行构造代码块初始化
7、对对象进行对应的构造函数初始化。
8、对内存地址付给栈内存中的p变量。
https://img-blog.csdn.net/20160705165946350
https://img-blog.csdn.net/20160705190221531
https://img-blog.csdn.net/20160705190325887
1、栈中:有了main主函数的对象p
栈中:new Person();
2、执行静态代码块,如果有的话,给Person.class类进行初始化。
3、空间开辟,有了属性name和age,空间开辟好后,就有了内存地址比如说是0x0023。
4、默认初始化:
name = null;
age = 0;
5、显示初始化:
(如果在定义成员变量时就赋值,比如说
private static name = “lisi”;
那么
name = “lisi”;
age = 0;
)
6、构造代码块初始化
7、构造函数初始化:
name = “zhangsan”;
age = 20;
8、把内存地址值0x0023赋给了p,p就指向了Person(“zhangsan”,20)这个对象
class StaticCode {
int num = 9;
StaticCode(){
System.out.println("b");
}
//静态代码块
static{
System.out.println("a");
}
{
System.out.println("c"+this.num);
}
StaticCode(int x){
System.out.println("d");
}
public static void show(){
System.out.println("show run");
}
}
class StaticCodeDemo {
static{
System.out.println("b");
}
public static void main(String[] args){
new StaticCode(4);
new StaticCode();
new StaticCode();
System.out.println("over");
}
static {
System.out.println("c");
}
}
/*
执行结果:
b
c
a
c9
d
c9
b
c9
b
over
*/