JAVA问个非常煞笔的问题 全局变量

cthgxy 2013-01-06 08:56:31
int a; //全局变量
public void main(String args[]){
for(int i=0;i<3;i++)
change(a);

System.out.println(a);
}

void change(int a1){
a=a1++
}

输出为什么是0 a已经被a1++了3次 而且每次进方法传入的a都改变了
为什么我调试的时候一退出方法全局a就变回0了
...全文
550 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheneyjava 2013-01-08
  • 打赏
  • 举报
回复
写个a++ 就oK了 下面那个方法无返回值的
西伯利亚猫 2013-01-08
  • 打赏
  • 举报
回复
sml_sunivo 2013-01-08
  • 打赏
  • 举报
回复
引用 2 楼 hucp2007 的回复:
a=a1++ 这句意思的a=a1;a1++; 那么a=a1时,由于a1没有初始化,所以编译时默认初始化为0,这是a=a1=0,然后a1++,即a1=1,但是方法change()的局部变量,离开change方法,a1生命周期结束,这时a=0,下次调用change(0),计算出a还是为0,。。。所以a一直等于0. lz要弄清楚a1++和++a1的区别,自己可以改下试试。
同意。。。
jojosanwen 2013-01-08
  • 打赏
  • 举报
回复
当声明全部变量 a时,JVM会在内存的静态存储区域分配一个存储空间,因为a没有初始化,所以空间里存的是int型默认值0,当执行change(a)时,JVM会在栈内存中分配一个存储空间给局部变量a,而它的值是从全部变量 a中复制过来的,所以也是0, 所以不管change()方法做什么操作,都是在改变局部变量a的值,对静态存储区域的全部变量a没有影响,change()方法结束后,栈内存里的局部变量a也随之释放掉,而静态存储区域里的全部变量a值还是0,也就跟循环多少次没有关系了 不知道理解的对不对~~~~~
放纵的青春 2013-01-08
  • 打赏
  • 举报
回复
百度下值传递和引用传递 这样解释吧 你传到change方法里面的a 只是上面那个a的一个副本 并不是a本身 你把那个副本怎么变都不会影响a本身
墨晟 2013-01-08
  • 打赏
  • 举报
回复
william_yao 2013-01-08
  • 打赏
  • 举报
回复
一楼二楼正解
架构师梦 2013-01-08
  • 打赏
  • 举报
回复
你change里面传进去的a1永远是成员变量a的值,也就是0; 这里的a1自加1没什么意义,因为a1++是指先运算后自加1,自加1之后方法结束,局部变量a1结束了
  • 打赏
  • 举报
回复
把你的int a; //全局变量 改为 static int a; //全局变量 即可
yjgyjg1997 2013-01-07
  • 打赏
  • 举报
回复
这个是值传递,不是引用传递。改变不了全局变量的值
mjhwy 2013-01-07
  • 打赏
  • 举报
回复
二楼解释到位,基础是王道
plumebobo 2013-01-07
  • 打赏
  • 举报
回复
main方法没有static。。。为啥没人说出来。。。
熊猫大虾 2013-01-07
  • 打赏
  • 举报
回复
你退出的时候a被重新加载了
Nazgul_ 2013-01-07
  • 打赏
  • 举报
回复
a1++一直等于0吧
hc334521 2013-01-07
  • 打赏
  • 举报
回复
错误太多了,唉,,java里参数都是值传递 所以基础类型再怎么变也没用,参数是局部变量,他有作用范围 class test { int a; public static void main(String[] args) { test te = new test(); te.add(te.a); System.out.println(te.a); } void add(int a ){ this.a++; } } 结果是1 你的那个 class test { int a; public static void main(String[] args) { test te = new test(); te.add(te.a); System.out.println(te.a); } void add(int a1 ){ a=++a1; } } 这样也可以是1
手插兜往前走 2013-01-07
  • 打赏
  • 举报
回复
引用 14 楼 A544365013 的回复:
你把a=a1++;改成a=++a1;试试
同意 a1++ 是先赋值在+1 ++a1 是先+1在赋值
取经和尚 2013-01-07
  • 打赏
  • 举报
回复
你把a=a1++;改成a=++a1;试试
huimiezu 2013-01-07
  • 打赏
  • 举报
回复
public class Test {
	static int a;

	/**
	 * 
	 * @param args
	 * @return void
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (int i = 0; i < 3; i++)
			change();

		System.out.println(a);
	}

	static void change() {
		a++;
	}
}
雪馨 2013-01-07
  • 打赏
  • 举报
回复
我写过一个博客:http://blog.csdn.net/xuexin8625/article/details/7938719【java】值传递和引用传递理解 不知道能不能够帮助你全面理解
_jerrytiger 2013-01-07
  • 打赏
  • 举报
回复
类似下面的问题,结果为0 int a = 0 ; a = a++ ; System.out.println(a); 。 a = a++ ; 可以解释为 tmp = a ; // tmp = 0 a++ ; // a = 1 a = tmp ; // a = 0
加载更多回复(4)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧