黑马程序员技术交流社区

标题: 面向对象的小问题 [打印本页]

作者: 徐君    时间: 2013-11-24 09:36
标题: 面向对象的小问题
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    时间: 2013-11-24 09:59
你的内存中只有P1一个对象,p2指向了P1,而你又给P2赋值就相当于给P1赋值,所以最终name = "李四";
age = 40。
作者: 樊志伟    时间: 2013-11-24 10:08
本帖最后由 樊志伟 于 2013-11-24 10:54 编辑

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


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

无标题.jpg

作者: 容嬷嬷当年也是    时间: 2013-11-24 10:12
C:\Users\Administrator\Desktop
作者: 容嬷嬷当年也是    时间: 2013-11-24 10:17
输出p1对象的内容为
姓名: 李四,年龄: 40

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


作者: 忄雾飞扬    时间: 2013-11-24 10:41
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对象,
                  
                  
                 */
        }

}
作者: 忄雾飞扬    时间: 2013-11-24 10:41
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对象,
                  
                  
                 */
        }

}
作者: mayor125    时间: 2013-11-24 11:04
语句分析:
  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, 下载次数: 21)

2013-11-24_110338.jpg

作者: 忘记了    时间: 2013-11-24 12:28
只new了一次,所以只有一个对象。
所以p1,p2都是指向同一个对象,然后对里面的数据进行更改。
所以,输出的也是同一个对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2