黑马程序员技术交流社区

标题: static定义的变量生命周期问题 [打印本页]

作者: 董霁辉    时间: 2013-3-12 00:06
标题: static定义的变量生命周期问题
本帖最后由 董霁辉 于 2013-3-12 14:41 编辑

程序片段
static int flag = 1;//为了打印美观,定义标记执行次数
public static void printArr(int[] arr){//定义一个方法,打印数组
                if(0!=flag%2)//如果flag为基数打印排序前数组,因为第一次调用打印数组函数时数组未排序,
                        System.out.print("排序前的数组{");
                else
                        System.out.print("排序后的数组{");//如果flag为偶数打印排序后数组,第二次调用打印数组时,数组已排序
                for(int x =0;x<arr.length;x++ ){
                        if(x!=arr.length-1)//未遍历到最后一个角标
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]+"}");
                }
                flag++;
        }
————————————————————————————————
问题:起初我以为flag的值会随着该方法调用次数增加而增加,但我把System.out.println(arr[x]+"}");改为System.out.println(arr[x]+"}"+flag);后,想不通为什么执行N次这个完整的程序后,flag的值始终是 1、2、3;下面是结果
排序前的数组{9,6,3,5,2,1,7,8,4}1
排序后的数组{1,2,3,4,5,6,7,8,9}2

请各位高手指点哈,

PS:虽然我的目的实现了,望您能讲下原理,flag为什么不会大于3呢,感谢
---------------------------------------------------------------------------------------
感谢大家指点,白天上班,客户催的紧,晚上贴出全部代码。
把System.out.println(arr[x]+"}");改为System.out.println(arr[x]+"}"+flag);是想查看下flag的值会不会像我想象的那样,
PS:flag作用:计数器,记录打印数组方法printArr(int[] arr)执行次数,用来控制
                if(0!=flag%2)//如果flag为基数打印排序前数组,因为第一次调用打印数组函数时数组未排序,
                        System.out.print("排序前的数组{");
                else
                        System.out.print("排序后的数组{");//如果flag为偶数打印排序后数组,第二次调用打印数组时,数组已排序
最初想法是对数组进行排序操作时打印文字信息,使输出看着爽点。即,打印一次原数组,然后再打印操作后的数组,因为对一个数组打印动作是成对出现,故 奇数次为原数组,偶数次为操作后的数组。
发帖时的疑问是:第一的感觉是flag会随着整个程序每一次的运行会增加,也是我希望的。但我多次运行后情况是每一次运行程序flag都会从1开始增加。
问题:怎样能实现当本次程序调用完printArr(int[] arr)后flag的值不会被摧毁,当下一次从main开始执行的时候,能够在上一次flag的值基础上继续增加?

作者: 李阳    时间: 2013-3-12 01:19
修改了下你的代码,你的代码有问题。
  1. class Test
  2. {
  3.         static int flag = 1;
  4.         public static void main(String[] args)
  5.         {
  6.                 for (int x = 0;x<10;x++ )
  7.                 {
  8.                         printArr();
  9.                 }
  10.         }
  11.        public static void printArr()
  12.            {       
  13.           if(0!=flag%2)
  14.              System.out.println(flag);
  15.           else
  16.              System.out.println(flag);
  17.           flag++;
  18.          }
  19. }
复制代码
我晕,代码乱了。
修改后的程序输出结果是1,2,3,4,5,6,7,8,9,10,我实在想不明白你的程flag的值是为什么是1,2,3.
再说你的程序问题,你的程序根本就没有对数组排序。下面这块代码只是迭代数组元素罢了。
for(int x =0;x<arr.length;x++ ){
                        if(x!=arr.length-1)//未遍历到最后一个角标
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]+"}");
                }

作者: 罗玉宁    时间: 2013-3-12 03:04
本帖最后由 罗玉宁 于 2013-3-12 03:06 编辑

兄弟把所有的代码贴出来,如果只是上面 那些代码的话是没有错误的。
  1. class test
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[] arr = {9,6,3,5,2,1,7,8,4};
  6. for(int i =0;i<arr.length;i++)
  7. printArr(arr);

  8. }
  9. static int flag = 1;
  10. public static void printArr(int[] arr){
  11. if(0!=flag%2)
  12. System.out.print("Former{");
  13. else
  14. System.out.print("After{");
  15. for(int x =0;x<arr.length;x++ ){
  16. if(x!=arr.length-1)
  17. System.out.print(arr[x]+",");
  18. else
  19. System.out.println(arr[x]+"}"+flag);
  20. }
  21. flag++;
  22. }

  23. }

复制代码

12.png (5.28 KB, 下载次数: 17)

12.png

作者: 杨玉辉    时间: 2013-3-12 12:10
我勒个去,看半天代码发现问题,flag++在循环外,仅执行了一遍,flag=2,
你内部循环即便+flag,把System.out.println(arr[x]+"}");改为System.out.println(arr[x]+"}"+flag);这里面的flag 值怎么会变呢

换个方向,即便你把flag++放进循环,它也应该变成0,1,2....9 的变化

除非 外部代码,你对flag 进行其它操作
作者: 陈丽莉    时间: 2013-3-12 12:46
请继续追问,最好将和flag有关的代码都贴出来。如果已自己想清楚并解决,请将帖子分类改成【已解决】~
作者: 董霁辉    时间: 2013-3-12 19:27
本帖最后由 董霁辉 于 2013-3-12 19:30 编辑

package com.itheima;
public class Test2 {
        static int flag = 0;//为了打印美观,定义标记执行次数
        public static void bubbleSort(int[] arr){
                for(int x = 0;x<arr.length-1;x++){
                        for(int y = 0;y<arr.length-x-1;y++){//-x,让每一次比较的元素减少,-1,避免数组角标越界
                                if(arr[y]>arr[y+1]){//如果前一个元素比后一个元素大,二者换位
                                        int temp = arr[y];
                                        arr[y] = arr[y+1];
                                        arr[y+1] = temp;
                                }        
                        }
                }
        }
        public static void printArr(int[] arr){//定义一个方法,打印数组
                flag++;
                if(0!=flag%2)//如果flag为基数打印排序前数组,因为第一次调用打印数组函数时数组未排序,
                        System.out.print("排序前的数组{");
                else
                        System.out.print("排序后的数组{");//如果flag为偶数打印排序后数组,第二次调用打印数组时,数组已排序
                for(int x =0;x<arr.length;x++ ){
                        if(x!=arr.length-1)//未遍历到最后一个角标
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]+"}");
                }
        }
        public static void main(String[] args) {
                int[] arr = {9,6,3,5,2,1,7,8,4};
                printArr(arr);//打印排序前数组
                bubbleSort(arr);
                printArr(arr);//打印排序后数组
                System.out.println("printArr(int[] arr)方法被调用了"+flag+"次。//此条语句为验证flag计数器的值与预想是否相同,非题目要求。");
        }
}
就是想让flag的值能够保留住,在下一次重新运行这个程序时能在flag上一次运行结果的基础上继续增加,当然在这个程序里面不需要,但想达到这个目的,各位给指点下呗




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