Java语言循环嵌套中变量的作用域总结思考。

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

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

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

                             *****

                             *****

                             *****

                             *****

两个程序如下:

// ===========test1-1

System.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中变量的作用范围的理解:变量numif相对于整个程序块来说都是属于全局变量,所以在初始化一次之后,直到整个程序停止运行并且再重新运行一次的时候,这三个变量才会重新初始化一次。因此,在内层while完成整一周循环之后变量f==num,所以此时将退出内层循环。在输出一个换行符并且i++之后,并且判断完循环条件之后再继续执行内部的while循环,此时却发现ffalse无法执行内部while循环。最终结果只能输出一行星号,因此总结出,变量的作用范围是从变量定义的位置开始,直到包含他的大括号结束。那什么时候结束呢?在这个变量的作用范围的语句块,或者是程序结束之后,这个变量就会被JVM垃圾回收,当重新执行这个语句块,这个程序的时候他才会重新定义并且初始化这个变量。

// ===========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的变量应当格外的注意到底是要放在哪里,是要设置为一个全局变量还是一个局部变量。

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


你可能感兴趣的:(JAVA基础,JAVA,变量作用域,局部变量,全局变量,while循环)