Java面试题(3)Java new一个对象的过程中发生了什么
序言
Person
class Person{ private String name; private int age; public Person() { super(); } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
new
public class NewObjectTest { public static void main(String[] args) { Person p = new Person("张三",18); System.out.println(p.toString()); } }
首先要明确的是在编译完成后,文件夹中会NewObjectTest.class和Person.class两个class文件
jvm读取main方法入口,发现Person p = new Person("张三",18); 这个需要new新对象的句子(实际并非如此,jvm读取的只是class中的字节码),然后进行以下操作:
1. 加载Person.class文件到方法区,同时加载Person类中的static属性
2. 在main方法所在的栈区分配引用(reference) p;
3. 在java堆中开辟空间存放Person类,但是不进行初始化操作。
4. 默认初始化数据
5. 将引用p指向java中新开辟的Person类
资料
https://www.cnblogs.com/JackPn/p/9386182.html
https://blog.csdn.net/weixin_41005192/article/details/80530530
https://www.cnblogs.com/ilovejaney/p/13867667.html