A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐君 中级黑马   /  2013-11-24 09:36  /  1521 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person{
        String name;
        int age;
        public void tell(){
                System.out.println("姓名:"+name+",年龄:"+age);
        }
}
public class a {
        public static void main(String[] args) {
                Person p1 = null;
                Person p2 = null;
                p1 = new Person();
                p2 = p1;
                p1.name = "张三";
                p1.age = 30;
                p2.age = 40;
                p2.name = "李四";
                System.out.println("p1对象的内容");
                p1.tell();
                System.out.println("p2对象的内容");
                p2.tell();
        }
}
求解释输出结果

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
FFF + 1 + 3 淡定

查看全部评分

8 个回复

倒序浏览
你的内存中只有P1一个对象,p2指向了P1,而你又给P2赋值就相当于给P1赋值,所以最终name = "李四";
age = 40。
回复 使用道具 举报
本帖最后由 樊志伟 于 2013-11-24 10:54 编辑

你这段代码中最关键的一句话就是 p2 = p1;
即p2指向了p1,也就是说,p2和p1实际上是一个对象实体。这样的话如果p2改变自己的属性,那么在p1看来也会改变属性,相当于p1,p2实际上是同一个人,只不过起了两个不同的名字而已。然后你就能明白为什么输出的都是李四,40了,因为p1和p2实际上是一个对象。可以简单点说就是p1和p2 在操作共享数据。


无标题.jpg (36.58 KB, 下载次数: 16)

无标题.jpg

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!还带图呢~真有心了!

查看全部评分

回复 使用道具 举报
C:\Users\Administrator\Desktop
回复 使用道具 举报
输出p1对象的内容为
姓名: 李四,年龄: 40

输出p2对象的内容为
姓名: 李四,年龄: 40

回复 使用道具 举报
public class Test1 {

        public static void main(String[] args) {
                //你创建了两个Person对象,指向了空
                Person p1 = null;
                Person p2 = null;
                //对p1对象进行初始化赋使p1指向了Person对象
                p1 = new Person();
                //让p2对象引用也指向了p1对象引用地址。也就是说,此时p1和p2对象的引用地址是一样的
                p2 = p1;
                //对p1进行name age赋值
                p1.name ="zhangsan";
                p1.age = 23;
                //对p2进行name age赋值,其实你这步的操作是覆盖了p1赋的值
                //就是说现在内存中的对象name age分别为lise 43;
                p2.age = 43;
                p2.name = "lise";
               
                System.out.println("p1,");
                //由于指向同一个对象,所以p1调用tell方法时,打印出了第二次赋的值
                p1.tell();
                System.out.println("p2");
                //p2当然也必须是打印的lise 和43
                p2.tell();
                /*
                          简单一句话,你这个类中,创建的两个Person对象指向的是内存中的一个new Person对象,
                  
                  
                 */
        }

}
回复 使用道具 举报
public class Test1 {

        public static void main(String[] args) {
                //你创建了两个Person对象,指向了空
                Person p1 = null;
                Person p2 = null;
                //对p1对象进行初始化赋使p1指向了Person对象
                p1 = new Person();
                //让p2对象引用也指向了p1对象引用地址。也就是说,此时p1和p2对象的引用地址是一样的
                p2 = p1;
                //对p1进行name age赋值
                p1.name ="zhangsan";
                p1.age = 23;
                //对p2进行name age赋值,其实你这步的操作是覆盖了p1赋的值
                //就是说现在内存中的对象name age分别为lise 43;
                p2.age = 43;
                p2.name = "lise";
               
                System.out.println("p1,");
                //由于指向同一个对象,所以p1调用tell方法时,打印出了第二次赋的值
                p1.tell();
                System.out.println("p2");
                //p2当然也必须是打印的lise 和43
                p2.tell();
                /*
                          简单一句话,你这个类中,创建的两个Person对象指向的是内存中的一个new Person对象,
                  
                  
                 */
        }

}

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!努力写在代码框里就更好了!.

查看全部评分

回复 使用道具 举报
语句分析:
  Person p1 = null;
  p1 = new Person();
  p2 = p1;
  p1.name = "张三";
  p1.age = 30;
主函数中p2 = p1这句话的意思是将对象p1的引用地址赋给对象p2,然后对象p2也就指向了p1的堆内存空间。此时对象p1和p2都指向了同一个内存空间,p1实例化时name和age属性的值分别是“张三”和“30”,然后p2又将name和age属性的值分别改为了“李四”“40”,所以最终的打印结果是:

p1对象的内容
姓名:李四,年龄:40
p2对象的内容
姓名:李四,年龄:40

以下贴上一张内存图:

2013-11-24_110338.jpg (29.23 KB, 下载次数: 22)

2013-11-24_110338.jpg
回复 使用道具 举报
只new了一次,所以只有一个对象。
所以p1,p2都是指向同一个对象,然后对里面的数据进行更改。
所以,输出的也是同一个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马