楼上的说得不太准确,准确地讲,p不是一个对象,其实p是一个引用.初学JAVA的时候可以把p理解成一个对象,但是到了后面编程,你会出现很多错误.
我们把你的这个代码拆开来讲,
Person p;执行这句代码时会在内存中开辟一段存储空间,用以存储一个引用(指针),由于你没有给这个引用(指针)赋值,所以,p现在是空指针,p==null成立!
new Person();的意思新建一个Person对象,然后放在对象栈中,对象栈是一个专门存放对象的一段存储空间,不能直接访问的,需要通过引用(指针)来间接访问,
最后解释=号的作用,他是说把后面的对象的引用(指针)赋给前面的,于是p就指向了一个对象.你现在就可以通过p来操作对象栈的对象了.
也许你会讲既然p始终指向的是该对象,那么直接认为他就是一个对象为什么说不对呢.来看看下面的代码(假设Person类有个public 变量int age代表一个人的年龄);
Person p=new Person();
p.age=10; //设置p的年龄为10岁
Person p2=p;
p2.age=20; //设置p2的年龄为20岁
System.out.println(p.age); //在屏幕上输出p的年龄
你认为会输出多少呢 ? 10? 那你就错了,屏幕上会输出20
因为p,p2是一个引用,p2=p的意思是把p的引用给p2,此时p和p2是同一个对象,在对象栈中指向同一个对象.p2改变了对象栈中的对象,因此p.age也会变.这个在C++中叫做浅拷贝,就是只把引用给p2,并没有生成新的对象.
也许你会说,只要我不用p2=p;这样的语句就不会错误了吧,但是在后面编程中你会把一个对象从一个类传到另一个类中,这样就避免不了这种浅拷贝.所以正确理解p的意义非常重要!