Person p = new Person("li",20); 到底干了些什么?

本文详细解析了Java中创建对象的具体步骤,从加载类文件到完成对象实例化的过程,包括类加载、初始化、属性初始化等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  Person  P  = new Person();

这是简单的创建对象的一个过程,那么,在这个过程中,具体发生了什么?

我们来简单探究一下这个过程。


第一步: new  Person(),使用到了Person.class 文件,JVM会找到Person.class文件,并将其加载到内存中。

第二步:类加载之后,会执行类中static代码块,如果有的话,给这个类进行初始化。

第三步:在堆内存中开辟空间,并分配内配内存地址。

第四步:在堆内存中建立对象的特有属性,并进行默认初始化。

第五步:对属性进行显性初始化

第六步:对属性进行构造代码块初始化

第七步:对属性进行对象的构造函数初始化

第八步:将内存中的地址赋给栈内存中的P 变量


如果这个类中有静态变量。静态变量不在堆中,而是方法区中。

#include<iostream> #include<cstring> using namespace std; class Data//年月日 { private:     int year;     int month;     int day; public:     Data(int year=1990,int month=1,int day=1);     Data(Data &r);     void print(); }; Data::Data(int Year,int Month,int Day) {     this->year=Year;     this->month=Month;     this->day=Day; } Data::Data(Data &r) {     year=r.year;     month=r.month;     day=r.day; } void Data::print() {     cout<<"生日:";     cout<<year<<'-'<<month<<'-'<<day<<endl; } class Person { private:     char name[20];     char gender;     Data birthday;     static int count; public:     Person(char Name[],char Gender,Data Birthday);     void print();     void GetCashFlow(); }; Person::Person():birthday() {     strcpy(name,"");     gender="\0"; } Person::Person(char Name[],char Gender,Data Birthay):birthday(Birthday) {     strcpy(name,Name);     gender=Gender; } void Person::print() {     cout<<"姓名:"<<name;     cout<<"性别:";     if(gender=='f')cout<<"女";     else if(gender=='m')cout<<"男";     birthday.print(); } void Person::GetCashFlow() {     return 0; } int Person::count=0; void Test1() {     Person p1,p2("zhang",'f',Data(1991,1,1)),p3(p2);     p3.print();     cout<<"收支为:"<<p3.GetCashFlow()<<"元"<<endl;     Person *p=new Person("li",'m',Data(1990,2,2));     p->print();     delete p; } /*void Test2() {     Student s1,s2("zhang",'m',Data(1992,1,1),1001);     s2.Print();     cout<<endl;     s2.SetDuration(2);     s2.Print();     cout<<endl<<"学费支出"<<s2.GetCashFlow()<<"元"<<endl;     Student *p=new Student;     delete p; }*/ int main() {     Test1();//测试Person类     //Test2();//测试Student类     return 0; }修改代码
最新发布
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值