当创建一个对象的时候

就像这样 Person p1;注意这里没有用new,这样创建的时候堆空间有这个对象的位置吗?,这个p1又指向那个位置呢 可以用set方法给成员变量赋值吗?如果能赋值说明堆空间有分配空间,可是他也没有用构造方法,堆空间怎么会开辟一个空间给这个对象?

这个只是在栈中申明了一个对象名,堆里面并没有申明内存空间,p1也没有指向任何地方,不能用set给他赋值。

在我的理解中 Person p1 仅仅是对象的声明,是对对象的引用。仅仅是在栈中,在堆里还没有空间。当然可以用set给他赋值,赋值的时候是把堆中已经创建好的对象地址引给了p1,也就是pi指向(代表了)你所赋值的那个对象。楼主‘如果能赋值说明堆空间有分配空间’这是不对的,堆开辟的空间是给的是你set操作的时候所赋值的那个对象,你在赋值的时候说明那个对象已经存在了,与p1并没有必然联系,而你的set方法是让他们联系在一起而已。!!!

对象只有真正实例化后才会在内存中给他开辟存储空间,就像你那样写的话,p1没有指向任何地址,那么它不可以操作对象的成员

这中实在栈内存中声明一个对象没,没创建堆内存,又没指向,当然没位置的,

建议楼主了解一下jvm的工作原理,最基础的东西喽