A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 房宝彬 黑马帝   /  2011-12-29 16:02  /  3888 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 房宝彬 于 2011-12-29 17:23 编辑

public class Deom

{
    public static void main (String[] args)
    {                                                问一个变量作用域的问题
                 int x = 5;         我在for循环外定义个变量,并赋值。
          for(int x =0;;)        然后在for里面在定义一个又定义了一个相同的变量。 请问,视频里讲的是 for 循环里的定义变量只在 循环里可以使用,循环结束,
                       这个变量也跟着没了,那么不就是说明这两个变量的作用域不一样么,我心里已经有几种解释,但是不知道哪种解释对,请大家指导一下原理
            下面就不写了
    }
}

20 个回复

倒序浏览
int x = 5;         //2、这个x的作用域
for(int x=0;;)//1、编译不通过,x已经定义 //3、比这个x大  //
回复 使用道具 举报
吴上储 发表于 2011-12-29 16:12
int x = 5;         //2、这个x的作用域
for(int x=0;;)//1、编译不通过,x已经定义 //3、比这个x大  // ...

重名问题我想过了,作用域和比这个X大,是什么意思?
回复 使用道具 举报
如下,这段程序代码是符合C++语言的语法要求的。其可以在C语言下正常运行。但是其在Java语言平台下编译的时候,就会被告知有错误。其格式、关键字上面都没有错误。那么错误到底是这么呢?这就关系到变量的作用域。
{
float y=3.15
{ float y=3.15
}
}
  作用域就决定了其定义的变量名的可见性与生命周期。在C++语言(包括其衍生出来的其他语言)与Java语言中,都是用一定花括号来代表一个作用域的。如上面的代码,就表示有两个作用域。外面一对花括号代表一级作用域;里面一对花括号代表二级作用域,依次类推。通常情况下,一级作用域中定义的变量,对其下级作用率都是有效的。也就是说,其下级作用域可以直接引用上级作用域中定义的变量。但是在二级作用域中,可以更改一级作用率中设置的变量值,不过这个更改只在二级作用域内部有效。如上面这个代码,在二级作用域中可以再定义一个y变量,重新赋值。注意,其实在二级作用域中定义的变量与一级作用域中定义的变量,虽然名字相同,但是他们不是同一个变量。如果此时在一级作用域外,有其他代码引用这个y变量的话,则其的值仍然是3.14,而不会是3.15。也就是说,在二级作用域中定义的变量,只在其内部有效。对于上级作用域是没有丝毫影响的。也就是说,在作用域中定义的变量只在其作用域内有效。出了其作用域外,其内部设置的变量就全部无效了。
  这个作用域的设置其实Java语言与C++语言是类似的。但是在细节上Java语言又多了一条限制。如上表的代码所示,虽然在上面的代码中变量y在两个不同的作用域中定义,照理来说是两者是互不干涉,可以共存。但是在Java编译器中,是不允许有这种情况存在的。把上面这个代码在Java编译器中编译的话,编译器会通知程序开发人员,说这个变量y已经定义过。然后编译会以错误告终。虽然在C++语言中在不同级别的作用域中定义名字相同的变量是允许的,而在Java语言中则不行,这并不代表在变量的作用域上有所不同。其实从本质上来说,两者变量的作用域是相同的。只是对于Java语言来说,其又多加了一条限制。在Java语言中,即使作用域不同,其定义的变量名字也不能够相同。这主要是为了提高Java代码的可读性,防止混淆才定义了这条规则。

回复 使用道具 举报
变量的作用域可以这么说,看变量时在什么地方定义的,分这么几种情况:文件内,类中,函数中,语句块。在上述哪种情况下定义的变量,作用域就是那种情况。你说的问题是第一个i作用域是main函数。第二个i作用域是for语句。具有相同名称的变量,就近不久远。在for语句中定义的i变量比main函数中定义的i近, for语句中的i就是局部定义的i;
回复 使用道具 举报
阮金明 发表于 2011-12-29 16:14
如下,这段程序代码是符合C++语言的语法要求的。其可以在C语言下正常运行。但是其在Java语言平台下编译的时 ...

大哥,C++怎么还出来了,你下面说了作用域决定了其定义的变量名的可见性与生命周期

那么我在循环外定义一个,我在for循环里又定义一个,那么for循环结束了,for的变量也没有了。那为什么还会错呢。
回复 使用道具 举报
付星 黑马帝 2011-12-29 16:20:11
7#
public static void main(String[] args) {
                int x=5;//这个可以在main大括号里有效
                for (int x = 0;;) {
                        //for里定义的只在这个for大括号里用
                }
        }
回复 使用道具 举报
吴上储 黑马帝 2011-12-29 16:20:32
8#
房宝彬 发表于 2011-12-29 16:13
重名问题我想过了,作用域和比这个X大,是什么意思?

int x =5 ;作用在main中
for(int x=0; ;)作用在for循环中
如果int x = 5;
    for( x=0;;) 这个x在for循环结束后就不被销毁
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 16:22:46
9#
hzs_android 发表于 2011-12-29 16:16
变量的作用域可以这么说,看变量时在什么地方定义的,分这么几种情况:文件内,类中,函数中,语句块。在上 ...

你说for循环里我定义一个X变量,那么这个X变量是随着循环开始而产生,循环结束而死亡。
那么跟for循环上面的变量有什么冲突么?除了变量名一样之外,还有什么冲突么?
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 16:27:30
10#
吴上储 发表于 2011-12-29 16:20
int x =5 ;作用在main中
for(int x=0; ;)作用在for循环中
如果int x = 5;

我可能问的不够明确,我知道作用域这个问题。
那么你说,在main定义个 X=5  我在FOR里又定义个X=0 当FOR循环结束的时候,FOR里的X=0也随着FOR结束而结束,而MAIN里的X=5 还会存在,那为什么还报错了呢
回复 使用道具 举报
是啊,   你这个就不单是作用域的问题了,在一个main()方法中定义了两个x变量,编译肯定出错,你没有按照JAVA的书写规则声明变量。你想:JAVA中取变量的值时是根据变量名取,在同一个main()方法中变量名一样了,那是按哪个变量取值呢?也就是JAVA书写规则中是不让在同一个方法中声明变量名相同的局部变量的!
      错误: 已在main(String[])中定义x
      for(int x=0;x<10;x++)
              ^
回复 使用道具 举报
吴上储 黑马帝 2011-12-29 16:34:23
12#
房宝彬 发表于 2011-12-29 16:27
我可能问的不够明确,我知道作用域这个问题。
那么你说,在main定义个 X=5  我在FOR里又定义个X=0 当FOR ...

你报的是什么错?
你若在main中定义了x  
for中怎么能让你又定义x?
你报的是错?
回复 使用道具 举报
黄战胜 黑马帝 2011-12-29 16:34:50
13#
房宝彬 发表于 2011-12-29 16:22
你说for循环里我定义一个X变量,那么这个X变量是随着循环开始而产生,循环结束而死亡。
那么跟for循环上 ...

这个不存在什么冲突,能有什么冲突存在。
程序中定义一个变量,就是分配一个存储空间,程序在执行的时候按照变量作于域规则对变量进行修改操作。程序编译完后,全是二进制,CPU在执行程序的时候,CPU知道哪个存储区叫什么名字吗?给变量取个名字,仅仅是为了给些程序员方便而已。根据不同的变量作用域,编译器会在不同的内存区域分配空间,为什么内存会分为堆,栈,这些东西。就是为了区分这些变量作用域。
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 16:37:48
14#
hzs_android 发表于 2011-12-29 16:34
这个不存在什么冲突,能有什么冲突存在。
程序中定义一个变量,就是分配一个存储空间,程序在执行的时候 ...

关键 我这么写他确实报错了,内存区域 这块我也知道,
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 16:41:21
15#
吴上储 发表于 2011-12-29 16:34
你报的是什么错?
你若在main中定义了x  
for中怎么能让你又定义x?

报错的就是定义重复了,但是我想到作用域问题,我就在研究 为什么会错,那错了,代表着作用域里又是如何代表的
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 16:43:53
16#
为梦而战 发表于 2011-12-29 16:33
是啊,   你这个就不单是作用域的问题了,在一个main()方法中定义了两个x变量,编译肯定出错,你没有按照JA ...

那也就是说,无论 for作用域是产生或者消失,定义变量的时候也要必须不可以重名。因为都是在main方法里的变量对么?
回复 使用道具 举报
int x=5,是main(){}的局部变量,已经声明了,for(int x=0){}中的x虽然是for(){}里的局部变量,但是for(){}这个语句还是在main()方法中,也就是for(){}语句中再定义变量的时候就不能和main(){}中定义的其它变量名一样了。当然也不是说同一个方法中就不能有名称一样的变量,要是有全局变量的话,是可以和局部变量在同一个方法中存在的。
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 17:22:23
18#
为梦而战 发表于 2011-12-29 17:15
int x=5,是main(){}的局部变量,已经声明了,for(int x=0){}中的x虽然是for(){}里的局部变量,但是for(){} ...

哦了,我知道了,主要就是 因为for也属于main方法里的,一个方法里不能有变量名一样的局部变量,即使在for里也不行。我一会在去研究下这个局部变量在内存中是怎样变化的就更清楚了,谢谢哈
回复 使用道具 举报
房宝彬 黑马帝 2011-12-29 17:23:26
19#
以上的朋友,十分感谢哈。个人感觉看完视频还要对视频里的知识点 深刻解析,要知道知其然,也要知其所以然。3Q
回复 使用道具 举报
房宝彬 发表于 2011-12-29 17:22
哦了,我知道了,主要就是 因为for也属于main方法里的,一个方法里不能有变量名一样的局部变量,即使在fo ...

:handshake
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马