版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PlainWaterh/article/details/78803870
在Java中,我们需要对对象进行初始化操作。
经常需要new 对象。但是new对象时到底发生了什么呢?
有时候我们不是特别清晰。
所以今天又重新学习了一下JavaSE部分,又有了新的感受。
在此记录一下
首先代码部分
Person类:
class Person{
private String name;
private int age;
private static String country = "cn";
Person(String name,int age){
this.name = name;
this.age = age;
}
//构造代码块
{
System.out.println(name+".."+age);
}
//静态代码块
static{
System.out.println("静态代码块");
}
public void setName(String name){
this.name = name;
}
public void speak(){
System.out.println(this.name+"..."
+this.age);
}
public static void showCountry(){
System.out.println("country="+country);
}
}
PersonDemo类(测试类)
class PersonDemo{
public static void main(String[] args) {
Person p = new Person("zhangsan",20);
}
}
在Person p = new Person(“zhangsan”,20);
在运行这句这行代码时做了什么呢?
首先栈内存中有个引用(p)
右边有 值(new Person())所以需要加载Person类,
当Person p = null;是不会加载Person类的
1. new 对象的的时候。JVM从硬盘中取Person.class文件并加载到内存中。
2. 执行该类中的static代码块(静态代码块),如果有的话,给Person.class类进行初始化
3. 并开辟了堆内存空间。分配内存地址
4. 在对内存中建立对象的特有属性,并进行默认初始化(比如int类型默认为0,引用类型默认为null等)。
5. 对属性进行显示初始化,
6. 对对象进行构造代码块初始化
7. 对对象进行对应的构造函数初始化
8. 将内存地址赋值给栈内存中的p变量