今日在做JAVA中的循环练习的时候,突然发现自己对变量的作用域很是模糊,所以做了下列总结。

引入问题:生成一个四行任意列的星星

例: 生成一个四行五列的星星

*****
*****
*****
*****

两个程序如下:

// ===========test1-1System.out.println("请输入一个数===test1-1");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int i = 0;
int f = 0;
while (i < 4) {
while (f < num) {
System.out.print("*");
f++;
}
System.out.println();
i++;
}

对于test1-1中变量的作用范围的理解:变量num,i,f相对于整个程序块来说都是属于全局变量,所以在初始化一次之后,直到整个程序停止运行并且再重新运行一次的时候,这三个变量才会重新初始化一次。因此,在内层while完成整一周循环之后变量f==num,所以此时将退出内层循环。在输出一个换行符并且i++之后,并且判断完循环条件之后再继续执行内部的while循环,此时却发现f

// ===========test1-2
System.out.println("请输入一个数===test1-2");
Scanner w = new Scanner(System.in);
int num1 = w.nextInt();
int i1 = 0;
while (i1 < 4) {
int f1 = 0;
while (f1 < num1) {
System.out.print("*");
f1++;
}
System.out.println();
i1++;
}=========(标记1)

对于程序test1-2的理解:此程序能够正确输出四行任意列的星号图,他与上一个程序的区别就是将变量f1定义的地方改变了,变量定义的地方放在了while循环内部,这样他的作用域就是从他定义的地方开始,一直到(标记1)结束,当这个变量作用范围内的while循环(即内部循环)结束之后,JVM就会自动回收这个变量f1,当继续执行外部while循环时程序会自上往下重新执行语句块,重新初始化这个变量f1,此时他的初始值为0,将满足循环条件,就可以产生正确的四行星星。如果像第一个程序块那样把变量放在外面,那么在重新执行内层循环的时候将不会使这个变量初始化,直接就不会满足内层循环的条件,只出来一行的星星。

注:一个变量的作用域就是从声明这个变流量的地方开始,到包含这个变量的花括号为止。离开作用域,变量所分配的内存空间将会被JVM回收,此时就可以进行这个变量的重复命名,并可以进行重新使用。什么时候算是离开这个作用域,当这个程序块执行完成之后,比如说循环判断条件不满足了,就会自动退出这个程序。

//用while完成
计算 ======1+(1+2)+(1+2+3)+(1+2+3+4)=?
//===分析得出每一组的组数group和这一组最后一个数num相同int group=1;//定义组数,组数从1开始,方便组内的计算。
int sum=0;//定义总和变量,将所有的组加起来之后的和
while (group<5)
{
int m=0;//====重点部位====
int num=1;
while (num<=group)
{
m=m+num;//m的初始值为0,num从1开始循环,一直循环加到当前的group的值。
num++;
}
sum=sum+m;
group++;
}System.out.println(sum);

分析:在这个程序中,我犯得错是将变量m定义在了外边,作为一个全局变量来使用了。当m定义为一个全局变量的时候(即是定义在外边),在内部的while循环中每一次执行m=m+num运算的时候,变量m的初始值都不为0,所以,算出来的每一组的值都会比正确的大前边所有组数的和。

总结:对于那些需要经常初始化为0的变量应当格外的注意到底是要放在哪里,是要设置为一个全局变量还是一个局部变量。

我觉得一般是设置为一个局部变量。一定要谨慎!!!