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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈艳南 中级黑马   /  2013-5-16 00:37  /  1830 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈艳南 于 2013-5-16 19:04 编辑

class Test1 {
        public static void main(String[] args) {
                C c1 = new C(6);
                C c2 = new C(new C(4));
                System.out.println(c1.c);
                System.out.println(c2.c);
        }
}
class C{
        int c;
        C(int a){
                int c = 0;
                for(int i=0;i <=a;i++){
                        c+=i;
                }
        }
        C(C b){
                c=b.c;
        }
}
为什么两次输出结果都为0呢

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

8 个回复

倒序浏览
class C{
        int c;
        C(int a){
                int c = 0;
                for(int i=0;i <=a;i++){
                        c+=i;
                }
        }
        C(C b){
                c=b.c;
        }
}

请注意红色的那行中的 c 是成员变量,蓝色的那行中的 c 是构造函数中的局部变量;
当实例化一个 C 对象时,蓝色的小 c 确实变化了,但红色的小 c 没有初始化;没有初始化默认值是 0;
所以代码中 c1.c  和 b.c 的值都是0;由 b.c = 0 可以推出 c2.c = 0.
不知道这么说能不能明白。

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
class C{
        int c;
        C(int a){
                int c = 0;
                for(int i=0;i <=a;i++){
                        c+=i;
                }
        }
        C(C b){
                c=b.c;
        }
}

请注意红色的那行中的 c 是成员变量,蓝色的那行中的 c 是构造函数中的局部变量;
当实例化一个 C 对象时,蓝色的小 c 确实变化了,但红色的小 c 没有初始化;没有初始化默认值是 0;
所以代码中 c1.c  和 b.c 的值都是0;由 b.c = 0 可以推出 c2.c = 0.
不知道这么说能不能明白。
回复 使用道具 举报
Class C中的 int c; c是成员变量, 默认初始值为0,
构造函数C(int a) 中的c, 是局部变量c,和 成员变量不是一个c, 当创建实例时,若调用该构造方法,c确实变化了,并随着方法的消失而消失~
两次输出的C1.c ,  C2.c 都是输出的成员变量c的值,该值默认初始化为0,所以是0.

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1 正解

查看全部评分

回复 使用道具 举报
当成员变量和局部变量重名时,成员变量会被屏蔽,也就是说在方法中改变的值只是局部变量的值。
如果在方法中还想使用成员变量,那么就需要在变量名前加上this.

  1. class Test1 {
  2.         public static void main(String[] args) {
  3.                 C c1 = new C(6);
  4.                 C c2 = new C(new C(4));
  5.                 System.out.println(c1.c);
  6.                 System.out.println(c2.c);
  7.         }
  8. }
  9. class C{
  10.         int c;//这里是成员变量
  11.         C(int a){
  12.                 int c = 0;//这时是局部变量,所以它会屏蔽掉外面的成员变量。
  13.                 for(int i=0;i <=a;i++){
  14.                         c+=i;//它改变的值一直都是局部变量的c,并不是成员变量的c。
  15. //如果想要改变成员变量的c,这里可以写成this.c +=i;
  16.                 }
  17.         }
  18.         C(C b){
  19.                 c=b.c;
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
C c1 = new C(6);
这句话回去执行C类中的 C(int a)这个函数,但是里面定义了一个零时变量c,导致你的这个函数运行结束后,c就会被回收,与C的成员c无关,所以打印出来的是c1.c是0。
第二个和上面的情况一样,你new C(4).c的值也是0,所以你打印的c2.c也是0.

可以使用this.c进行赋值操作,这样就会操作到C的成员变量c了。
回复 使用道具 举报
楼主你好   如果帖子已经解决  请把帖子的类型改为“已解决”。
回复 使用道具 举报
石贤芝 发表于 2013-5-16 01:02
class C{
        int c;
        C(int a){

如果把那么蓝色的c注释掉 下面那个下面那个c+=i中的c就是默认的成员变量中的c(this.c+=i) 如果没注释掉其实就是 这个构造方法自己的c  他运行完方法之后会弹栈 并没有其他赋值的作用 可以这样理解吗
回复 使用道具 举报
沈艳南 发表于 2013-5-16 11:55
如果把那么蓝色的c注释掉 下面那个下面那个c+=i中的c就是默认的成员变量中的c(this.c+=i) 如果没注释掉其 ...

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