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.
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。
//如果想要改变成员变量的c,这里可以写成this.c +=i;
}
}
C(C b){
c=b.c;
}
}
复制代码
作者: 刘胜寒 时间: 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.