黑马程序员技术交流社区
标题:
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
修改了下你的代码,你的代码有问题。
class Test
{
static int flag = 1;
public static void main(String[] args)
{
for (int x = 0;x<10;x++ )
{
printArr();
}
}
public static void printArr()
{
if(0!=flag%2)
System.out.println(flag);
else
System.out.println(flag);
flag++;
}
}
复制代码
我晕,代码乱了。
修改后的程序输出结果是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 编辑
兄弟把所有的代码贴出来,如果只是上面 那些代码的话是没有错误的。
class test
{
public static void main(String[] args)
{
int[] arr = {9,6,3,5,2,1,7,8,4};
for(int i =0;i<arr.length;i++)
printArr(arr);
}
static int flag = 1;
public static void printArr(int[] arr){
if(0!=flag%2)
System.out.print("Former{");
else
System.out.print("After{");
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++;
}
}
复制代码
12.png
(5.28 KB, 下载次数: 17)
下载附件
2013-3-12 03:06 上传
作者:
杨玉辉
时间:
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