黑马程序员技术交流社区

标题: 一个题 [打印本页]

作者: 吃阁子的猫    时间: 2013-8-29 20:51
标题: 一个题
public static void main(String[] args) {
  C c1 = new C(6);
  C c2 = new C(new C(4));
  System.out.println("c1:"+c1);
  System.out.println("c2:"+c2);
}
}
class C{
int c;
C(int a){
  c = 0;
  for (int i = 0; i <=a; i++) {
   c = c+i;
  }
}
C(C b) {        // 是C=new C(new C(4))吗?
  c = b.c;        //不明白
}
}



作者: Nero    时间: 2013-8-29 21:29
是的
C c1 = new C(6);
传的是6这个基本数据类型  输出c1这个对象的哈希值
C c2 = new C(new C(4));
传的是 C(4) 这个对象的地址,属于应用数据类型  输出c2这个对象的哈希值
我想这个例子是想看传两种数据类型有什么区别吧
作者: 张云飞    时间: 2013-8-29 21:39
其实他还就是一个构造方法,参数是C的对象。
而  C c2 = new C(new C(4));就是
1、首先用第一个构造方法声明一个匿名对象,该对象中的c初始化为0+1+2+3+4=10;
2、将该将该对象作为参数传入第二个构造方法,来声明另一个对象,c2即为其引用,此时第二个对象里的c被初始化为其参数对象中的成员变量c,即为10。
所以:
  System.out.println("c1:"+c1.c);
  System.out.println("c2:"+c2.c);
应该为:c1:21
              c2:10
像你那样打印出来的是对象地址,C@*******






作者: 神之梦    时间: 2013-8-29 21:39
以后发云6去吧,在最新版区发帖比较好
作者: Nero    时间: 2013-8-29 21:40
c=b.c;
是说
其实是this.c=b.c       b也是C类的一个对象
就是说:
传进去的这个b对象的c值  要和  新建的对象的c值相同
比如
C c2 = new C(new C(4));
把new C(4)这个匿名对象的c值 4 赋给 c2对象中的c;
再简单点  c2的c=new C(4)的c



我快晕了!!!!
作者: Nero    时间: 2013-8-29 21:48
张云飞 发表于 2013-8-29 21:39

按照你的理解
c1应该是10
c2才是21
你是不是写反了!!
况且类的对象哪个不是引用啊!!  c1 也是引用啊

作者: 泡沫之夏    时间: 2013-8-30 00:56
是b=new C(new C(4)) 所以b.c是顺理成章的事
作者: 吃阁子的猫    时间: 2013-8-30 07:39
神之梦 发表于 2013-8-29 21:39
以后发云6去吧,在最新版区发帖比较好

呵呵,感觉..云5..热闹一点

作者: 吃阁子的猫    时间: 2013-8-30 08:02
张云飞 发表于 2013-8-29 21:39

不好意思,是我漏写了,还是不明白C(C b),如果C=new C(new C(4)),那不是2次调用第一个构造函数吗?
作者: 吃阁子的猫    时间: 2013-8-30 08:05
Nero 发表于 2013-8-29 21:40
c=b.c;
是说
其实是this.c=b.c       b也是C类的一个对象

呵呵,有点晕
作者: 张云飞    时间: 2013-8-30 20:01
Nero 发表于 2013-8-29 21:48
按照你的理解
c1应该是10
c2才是21

可能我说的太模糊了,我上面列出来的两条都是在解释 C c2 = new C(new C(4)); 这一句话。
1、首先看new C(4)。这不是匿名对象吗,在内存中该对象中有一个成员变量c吧,
这是用下边的构造方法声明的,
C(int a){
  c = 0;
  for (int i = 0; i <=a; i++) {
   c = c+i;
  }
}
不就是4带到循环里边吗,所以该对象的成员变量c=10。对不对。
2、第二步,new C(匿名对象),
C(C b) {  //此处参数相当于C b = new C(4);       所以b就是第一次对象的声明
     c = b.c;     //自然此处的c = b.c = 10;        所以结果c2:10  啊
}
结果c2:10。不对吗。至于C c1 = new C(6);我一直没说吧,也不用说吧。
你的最后一句话不太理解:“况且类的对象哪个不是引用啊!!  c1 也是引用啊“
对象是对象,引用是引用,貌似不一样吧。我也没这样说吧
比如参数new C(4);这仅仅是声明了对象,好像没有 给引用(当然下边可以理解为C b = new C(4);这就把对象的地址给了b,b也就是对象的引用)。
我上面对楼主的最后的回答只是想说,楼主的测试代码
System.out.println("c1:"+c1);
System.out.println("c2:"+c2);
两个打印出来的都是地址,而不是他想要的成员变量c的值,所以应该
System.out.println("c1:"+c1.c);
System.out.println("c2:"+c2.c);








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