java变量作用域问题

zycxnanwang
领域专家: 算法与数据结构技术领域
2016-08-08 08:06:10
public class testfor
{
public static void main(String[] args)
{
for(int i=1;i<10;i++)
{
System.out.println(i);
}
int i = 13;
System.out.println(i);
}
}

这是第一种情况,编译可以通过,最后打印出来的数是13;for里面的int只在代码块有效

同样的下一个代码为什么就不能通过编译
public class testfor
{
public static void main(String[] args)
{
int i = 13;
for(int i=1;i<10;i++)
{
System.out.println(i);
}
System.out.println(i);
}
}


求位大牛解释一下!
...全文
629 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
HerveyHall 2016-08-10
  • 打赏
  • 举报
回复
引用 16 楼 zycxnanwang 的回复:
嗯,谢了,我这是用记事本编的,有点挫,练一下自己手写程序的能力,之后转到eclipse!
加油
yekes 2016-08-10
  • 打赏
  • 举报
回复
【zycxnanwang】同学的问题非常有独到之处啊,这个两段代码可以分为两个次回答。 代码一:传统的程序化语言C,要求定义变量都在一个块的开头定义,但是Java可以在块的范围内分散变量声明。 代码二:为什么main块中的变量影响到了if块,因为嵌套块中定义的变量名不能相同,但是为什么代码一没有影响,因为【Java可以在块的范围内分散变量声明。】 总结:一,Java可以在块的范围内分散变量声明。 二,嵌套块中定义的变量名不能相同。 以上的回答不知道对你有没有帮助。
zycxnanwang 2016-08-10
  • 打赏
  • 举报
回复
引用 21 楼 hjgzj 的回复:
我不知道,也不能瞎说,不过我看楼上说的都没有引用书上的解释,好像是根据运行结果YY出来的总结
那本书上有这方面的介绍,求推荐!
  • 打赏
  • 举报
回复
我不知道,也不能瞎说,不过我看楼上说的都没有引用书上的解释,好像是根据运行结果YY出来的总结
NewMoons 2016-08-09
  • 打赏
  • 举报
回复
引用 5 楼 zycxnanwang 的回复:
[quote=引用 2 楼 NewMoons 的回复:] 1楼说的正解。不过我估计楼主还是不理解。他会说调用函数时为何不报错? for循环只是代码块,在里面定义的变量不能与for之外的变量共享,但外面的变量可以与里面的共享。函数不同,那是传参(这个就不展开了,自行百度),理解了么? 再不理解,看看下面修正后的代码,就不会报错了:
public class testfor {
	public static void main(String[] args) {
		int i = 1;
		for (; i < 10; i++) {
			System.out.println(i);
		}
		System.out.println(i);
	}
}
在c语言中,代码块内的变量定义会隐藏代码块外的定义,java没有这种技术? java中for外面的int,作用域是从其声明的地方到类结束,包括代码块内?[/quote] 1、在c语言中,代码块内的变量定义会隐藏代码块外的定义,java没有这种技术? 没有(这不叫什么技术吧,一种规范而已),再说为什么非要有?但我知道JavaScript可以有。 java这么做的目的我想还是它的一贯宗旨:强类型,安全第一(不然2个相同变量的使用容易引起混淆)。 再比如指针在java也没有,java不允许代码直接操作内存。这么做虽然失去了一定的灵活性,但也保证了代码的安全。 2、java中for外面的int,作用域是从其声明的地方到类结束,包括代码块内? 不是到类结束,是方法结束。 好紧张,楼主是否会有新的问题?怕答不上来。
bailixi1 2016-08-09
  • 打赏
  • 举报
回复
成员变量又称为类变量,分为静态和非静态。静态成员变量是在方法区中,并且在准备阶段为其分配内存并设为jvm默认的初值,非静态成员变量在堆内存中,作用于整个类中,非静态的变量,实例化时在堆中为其分配内存。 局部变量如果是基础类型,则在栈上,如果是引用类型,则引用被存在栈上,引用指向的对象是在堆上。
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
引用 13 楼 HerveyHall的回复:
lz的问题楼上都已经解释的很明白了,我想告诉lz的是eclipse有自动对齐功能,默认是Ctrl+Shift+F
嗯,谢了,我这是用记事本编的,有点挫,练一下自己手写程序的能力,之后转到eclipse!
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
引用 12 楼 MONKEY_D_GARP的回复:
[quote=引用 1 楼 weixin_35722556 的回复:] code2 :代码中int i 在main中一直有效,那么for中有定义,当然会检测出来有问题的。
你int 一样的干嘛[/quote] 我想测试一下变量的作用域!
lucifarcyl 2016-08-09
  • 打赏
  • 举报
回复
变量作用于包围它的最小范围的大括号内,第二种还在i的作用域内怎么可以重新定义一个i
HerveyHall 2016-08-09
  • 打赏
  • 举报
回复
lz的问题楼上都已经解释的很明白了,我想告诉lz的是eclipse有自动对齐功能,默认是Ctrl+Shift+F
nikyotensai 2016-08-09
  • 打赏
  • 举报
回复
引用 1 楼 weixin_35722556 的回复:
code2 :代码中int i 在main中一直有效,那么for中有定义,当然会检测出来有问题的。
你int 一样的干嘛
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
引用 9 楼 soton_dolphin 的回复:
一个变量的作用域范围就是在包裹着这个变量的两个大括号之间。方法参数的作用域就是这个方法的两个大括号之间
嗯,大神,java对变量的内存是怎么分配的?,想了解一下java的内存机制?
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
引用 6 楼 NewMoons 的回复:
[quote=引用 5 楼 zycxnanwang 的回复:] [quote=引用 2 楼 NewMoons 的回复:] 1楼说的正解。不过我估计楼主还是不理解。他会说调用函数时为何不报错? for循环只是代码块,在里面定义的变量不能与for之外的变量共享,但外面的变量可以与里面的共享。函数不同,那是传参(这个就不展开了,自行百度),理解了么? 再不理解,看看下面修正后的代码,就不会报错了:
public class testfor {
	public static void main(String[] args) {
		int i = 1;
		for (; i < 10; i++) {
			System.out.println(i);
		}
		System.out.println(i);
	}
}
在c语言中,代码块内的变量定义会隐藏代码块外的定义,java没有这种技术? java中for外面的int,作用域是从其声明的地方到类结束,包括代码块内?[/quote] 1、在c语言中,代码块内的变量定义会隐藏代码块外的定义,java没有这种技术? 没有(这不叫什么技术吧,一种规范而已),再说为什么非要有?但我知道JavaScript可以有。 java这么做的目的我想还是它的一贯宗旨:强类型,安全第一(不然2个相同变量的使用容易引起混淆)。 再比如指针在java也没有,java不允许代码直接操作内存。这么做虽然失去了一定的灵活性,但也保证了代码的安全。 2、java中for外面的int,作用域是从其声明的地方到类结束,包括代码块内? 不是到类结束,是方法结束。 好紧张,楼主是否会有新的问题?怕答不上来。[/quote]大神,说笑了,想问一下成员变量,局部变量,所在的内存区域?
soton_dolphin 2016-08-09
  • 打赏
  • 举报
回复
一个变量的作用域范围就是在包裹着这个变量的两个大括号之间。方法参数的作用域就是这个方法的两个大括号之间
MoshangYanYu 2016-08-09
  • 打赏
  • 举报
回复
引用 7 楼 MoshangYanYu 的回复:
第一段代码,for循环里面定义的int i=1,作用域仅限于for循环内。。。循环结束就被GC回收了。。。 所以在循环外定义int i=13没有问题。。。 但是第二段代码就不行了。。。for循环的作用域内同时出现两个int i。。。重名了。。。除非改掉其中一个
说错了。。。第二段代码里面的int i=13的作用域大于for循环作用域。。。于是int i=13这个变量可以被for循环使用。。。也就是共享。。。。可是你又在for循环里定义了int i=1。。。所以冲突了
MoshangYanYu 2016-08-09
  • 打赏
  • 举报
回复
第一段代码,for循环里面定义的int i=1,作用域仅限于for循环内。。。循环结束就被GC回收了。。。 所以在循环外定义int i=13没有问题。。。 但是第二段代码就不行了。。。for循环的作用域内同时出现两个int i。。。重名了。。。除非改掉其中一个
NeColor 2016-08-09
  • 打赏
  • 举报
回复
引用 17 楼 bailixi1 的回复:
成员变量又称为类变量,分为静态和非静态。静态成员变量是在方法区中,并且在准备阶段为其分配内存并设为jvm默认的初值,非静态成员变量在堆内存中,作用于整个类中,非静态的变量,实例化时在堆中为其分配内存。 局部变量如果是基础类型,则在栈上,如果是引用类型,则引用被存在栈上,引用指向的对象是在堆上。
类变量和成员变量不同好吧,类变量就是static变量,成员变量是相对于方法里面的局部变量来说的
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
什么java书上有介绍java内存分配的?给推荐一下,我好好琢磨!
zycxnanwang 2016-08-09
  • 打赏
  • 举报
回复
引用 17 楼 bailixi1 的回复:
成员变量又称为类变量,分为静态和非静态。静态成员变量是在方法区中,并且在准备阶段为其分配内存并设为jvm默认的初值,非静态成员变量在堆内存中,作用于整个类中,非静态的变量,实例化时在堆中为其分配内存。 局部变量如果是基础类型,则在栈上,如果是引用类型,则引用被存在栈上,引用指向的对象是在堆上。
嗯,写了,我好好琢磨一下!
zycxnanwang 2016-08-08
  • 打赏
  • 举报
回复
引用 2 楼 NewMoons 的回复:
1楼说的正解。不过我估计楼主还是不理解。他会说调用函数时为何不报错? for循环只是代码块,在里面定义的变量不能与for之外的变量共享,但外面的变量可以与里面的共享。函数不同,那是传参(这个就不展开了,自行百度),理解了么? 再不理解,看看下面修正后的代码,就不会报错了:
public class testfor {
	public static void main(String[] args) {
		int i = 1;
		for (; i < 10; i++) {
			System.out.println(i);
		}
		System.out.println(i);
	}
}
在c语言中,代码块内的变量定义会隐藏代码块外的定义,java没有这种技术? java中for外面的int,作用域是从其声明的地方到类结束,包括代码块内?
加载更多回复(4)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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