黑马程序员技术交流社区

标题: 成员变量和局部变量的相关问题 [打印本页]

作者: 沈艳南    时间: 2013-5-16 00:37
标题: 成员变量和局部变量的相关问题
本帖最后由 沈艳南 于 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呢


作者: 石贤芝    时间: 2013-5-16 01:01
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.
不知道这么说能不能明白。

作者: 石贤芝    时间: 2013-5-16 01:02
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.
不知道这么说能不能明白。

作者: JinnyZh    时间: 2013-5-16 01:44
Class C中的 int c; c是成员变量, 默认初始值为0,
构造函数C(int a) 中的c, 是局部变量c,和 成员变量不是一个c, 当创建实例时,若调用该构造方法,c确实变化了,并随着方法的消失而消失~
两次输出的C1.c ,  C2.c 都是输出的成员变量c的值,该值默认初始化为0,所以是0.
作者: 飞鸟青崖    时间: 2013-5-16 07:31
当成员变量和局部变量重名时,成员变量会被屏蔽,也就是说在方法中改变的值只是局部变量的值。
如果在方法中还想使用成员变量,那么就需要在变量名前加上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. }
复制代码

作者: 刘胜寒    时间: 2013-5-16 10:11
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 11:49
楼主你好   如果帖子已经解决  请把帖子的类型改为“已解决”。
作者: 沈艳南    时间: 2013-5-16 11:55
石贤芝 发表于 2013-5-16 01:02
class C{
        int c;
        C(int a){

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

理解正确。。。




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