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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃阁子的猫 中级黑马   /  2013-8-29 20:51  /  2288 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;        //不明白
}
}


评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

10 个回复

倒序浏览
是的
C c1 = new C(6);
传的是6这个基本数据类型  输出c1这个对象的哈希值
C c2 = new C(new C(4));
传的是 C(4) 这个对象的地址,属于应用数据类型  输出c2这个对象的哈希值
我想这个例子是想看传两种数据类型有什么区别吧

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
其实他还就是一个构造方法,参数是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@*******





评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
以后发云6去吧,在最新版区发帖比较好
回复 使用道具 举报
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



我快晕了!!!!
回复 使用道具 举报

按照你的理解
c1应该是10
c2才是21
你是不是写反了!!
况且类的对象哪个不是引用啊!!  c1 也是引用啊
回复 使用道具 举报 1 0
是b=new C(new C(4)) 所以b.c是顺理成章的事
回复 使用道具 举报
神之梦 发表于 2013-8-29 21:39
以后发云6去吧,在最新版区发帖比较好

呵呵,感觉..云5..热闹一点
回复 使用道具 举报

不好意思,是我漏写了,还是不明白C(C b),如果C=new C(new C(4)),那不是2次调用第一个构造函数吗?
回复 使用道具 举报
Nero 发表于 2013-8-29 21:40
c=b.c;
是说
其实是this.c=b.c       b也是C类的一个对象

呵呵,有点晕
回复 使用道具 举报
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);



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马