已有101人关注
请教静态变量作用域
发表在Java图书答疑 2010-03-19
是否精华
版块置顶:
书中例7.13:


public class CopyOfTransferProperty {
static int i=47;
public void call(){
System.out.println("调用Call方法");
[font color=#FF0000]for(i=0;i<3;i++)[/font]{
System.out.print(i+" ");
if(i==2){
System.out.println("\n");
}
}
}
public CopyOfTransferProperty(){

}
public static void main(String[] args) {
CopyOfTransferProperty t1=new CopyOfTransferProperty();
CopyOfTransferProperty t2=new CopyOfTransferProperty();
t2.i=60;
System.out.println("第一个实例对象调用变量i的结果:"+t1.i++);
t1.call();
System.out.println("第二个实例对象调用变量i的结果:"+t2.i);
t2.call();

}

}
输出结果:
第一个实例对象调用变量i的结果:60
调用Call方法
0 1 2 

第二个实例对象调用变量i的结果:3
调用Call方法
0 1 2 

如果在for(i=0;i<3;i++)中的i 前加上int,输出结果就会为:
第一个实例对象调用变量i的结果:60
调用Call方法
0 1 2 

第二个实例对象调用变量i的结果:61
调用Call方法
0 1 2 
很明显,在for语句中的i是个局部变量,其作用域只在for的范围内有效。
但静态成员变量i(static int i=47;)不是在整个类范围内都有效吗,如此一来,两个同名变量的作用域岂不是发生了重叠,而系统又没有报错。
请给解释一下,谢谢。


另:有个小疑问,例7.8中:static double PI=3.1415; //这是定义的静态常量吗?(书中是这么注释的),这不是变量吗?
分享到:
精彩评论 1
柠檬草
学分:0 LV1
2010-03-20
沙发
读者您好!
第一个问题:
建议你了解一下Java的覆盖原则。加上int就是重新定义了一个变量i,当变量i生命周期结束时隐藏的静态变量才能重新使用,这个时候静态变量i就会隐藏,在你调用第一个方法后静态变量变为61并隐藏;如果不加程序就是一直在调用静态变量,i并不会隐藏。
第二个问题:
你提出的问题很好,它确实是静态变量,如果加上final关键字它就是静态常量了。
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照