
在java中实例化一个类,调用属性赋值 此属性存在于内存哪里
eate=neweat();e.setName("花花");eate2=neweat();e2.setName("花花");①System.out.println(e==...
eat e=new eat();
e.setName("花花");
eat e2=new eat();
e2.setName("花花");
①System.out.println(e==e2);//false
②System.out.println(e.equals(e2));//false
③System.out.println(e.getName()==e2.getName());//true
④System.out.println(e.getName().equals(e2.getName()));//true
提问:
此时 e 和 e2 不是在内存中开辟出两块不同的内存空间吗?为什么此时③语句输出的结果是true呢? 展开
e.setName("花花");
eat e2=new eat();
e2.setName("花花");
①System.out.println(e==e2);//false
②System.out.println(e.equals(e2));//false
③System.out.println(e.getName()==e2.getName());//true
④System.out.println(e.getName().equals(e2.getName()));//true
提问:
此时 e 和 e2 不是在内存中开辟出两块不同的内存空间吗?为什么此时③语句输出的结果是true呢? 展开
1个回答
2017-05-27
展开全部
e==e2是对象比较,比较的是e/e2的引用地址,就是堆栈,e.equals(e2)是用eat的equals方法比较,没有重写的话默认==。而e.getName()与e2.getName()的 == 相对复杂,在栈中查找有没有存放值为e.getName(),即"花花"的地址,如果没有,则开辟一个存放字面值为"花花"的地址,字符串值指向这个地址。如果已经有了值为"花花"的地址,则返回其地址。所以当栈中存在你想创建的变量的值的时候,其实是引用已经存在栈中的地址,不是新建的。e.getName().equals(e2.getName())则是直接比较值,与引用地址无关。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询