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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-9-26 12:06  /  2869 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这个问题我原来一直在用我也知道可以这样用,但是昨天突然意识到,我很不理解,希望能帮我解释清楚
1.变量都有自己的作用域,在一个作用域内一个变量只能声明一次,这句话没错吧?如果有错,请说明理由,我感觉是没错的。
就像
void method() {
    int i = 0;
    {
         int i = 4;//这样是错误的,因为会重复声明。
   }
}


但是,下面这里面就可以
class Person {
    int age ;
    void eat()  {
        int age = 20;//这样就是可以的,程序不会报错
    }
}

问题,在同一个作用域里面对一个变量只能声明一次,但是在Perosn类中对于成员变量中的int age,他的作用域是在Person类这个大括号中,这个大括号报错了eat方法中的小括号,为什么在eat方法中还可以再声明 int age = 20;

我知道成员变量存储在堆内存中,而局部变量存数在栈内存中,但是我就是不明白为什么在person类中的就可以在一个大括号内对一个变量声明两次,不是一个大括号内只能声明一次吗,麻烦帮忙给我解释解释,我晕了...........


评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 头像很牛

查看全部评分

12 个回复

倒序浏览
成员方法中的变量仅在该方法的大括号内有效,按你的理解“person类中的就可以在一个大括号内对一个变量声明两次,”,莫非成员方法中的i 能离开成员方法作用域吗? “不是一个大括号内只能声明一次吗”?确实都是一次啊,成员变量在它的括号内声明了一次啊,成员方法的局部变量在它的大括号内声明了一次啊。一个类包含成员变量和成员方法吧,Java可没有规定成员方法可以包含成员变量吧。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我个人认为理解问题,特别是刚学习的时候,不要太深入钻研下去,钻研到一定深度就可以了,太深入了会迷糊的。如果实在理解不了,那就死记下来语法规则,JAVA开发的时候别人定义好了的,不会因为你不理解而改变,否则,当初为什么不把class 用中文“类”表示呢。适可而止吧,学到后面还会自然理解的,因为学的知识还不够宽,还有局限性。谢谢!
回复 使用道具 举报
void method() {
     int i = 0;
     {
          int i = 4;//这样是错误的,因为会重复声明。
    }
}
你这样肯定错误啊,又不是大括号就是一个作用域
你会有try-catch吧,这样你应该知道所谓作用域是什么标志的?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
成员变量只能定义在类中,与成员方法并列,不能在方法中; 局部变量只能定义在方法或语句中
成员变量有权限设定,局部变量没有权限设定
成员变量与局部变量是两种不同的东西,就像猫和狗都是动物一样并不会冲突,不知道这样比喻合不合适...{:soso_e127:}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 很给力!

查看全部评分

回复 使用道具 举报
很简单的,一个是成员变量,一个是局部变量,它们作用于不同的域里面,所以是可以重新声明的;我就是这么理解的!
回复 使用道具 举报
翁鹏 高级黑马 2012-9-26 13:58:03
7#
局部变量屏蔽实例变量!
回复 使用道具 举报
李铁 中级黑马 2012-9-26 14:14:32
8#
在补充一点吧
void method() {
     int i = 0;
  //下面这个大括号是一个构造代码块,类似于构造函数;用于给对象初始化,
//当你new一个对象的时候,对象就有i这个变量了,你在构造代码块里又声明变量i时,就会报错,它不是成员方法.
     {
          int i = 4;//这样是错误的,因为会重复声明。
    }
}
回复 使用道具 举报
孙岳 中级黑马 2012-9-26 14:20:29
9#
本帖最后由 孙岳 于 2012-9-26 14:21 编辑

void method() {
    int i = 0;
    {                       //这里是一个普通的代码块,里面定义的i和上面定义的i都是局部变量,所以 重复。
        int i = 4;//这样是错误的,因为会重复声明。
   }
}
但是,在这个类里面
class Person {
    int age ;        //这个age是类成员变量,作用域是整个类,相当于this.age,只是把this省略了。   
void eat()  {
        int age = 20;//这样就是可以的,程序不会报错   //而这个age是个普通的局部变量,作用域是eat方法,跟上面的age虽然作用域有重复,但不是相同的变量,所以不重复。   
}
}



点评

明白了,说的很好,谢谢  发表于 2012-9-26 20:50

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 很给力!

查看全部评分

回复 使用道具 举报
补充一点,还记得setName方法吗?
public Person
{
        private String name;
     public void setName(String name)
      {
             this.name = name;
      }
}
为什么要写this.name呢?就是因为如果写name = name的话,这两个name都是参数里的name,相当于自己赋给自己,加上this才是类变量name,才是给类变量赋值。所以,类里面的name和方法里的name是不一样的。
回复 使用道具 举报
楼上正解,可以看下这BLOG

http://blog.csdn.net/woainike/article/details/6413984

评分

参与人数 1黑马币 +30 收起 理由
唐志兵 + 30 发地址没分

查看全部评分

回复 使用道具 举报
class Person {
    int age ;
    void eat()  {
        int age = 20;//这样就是可以的,程序不会报错
    }
}

一个全局变量,一个局部变量,在局部调用age,你可以把它认为是两个不同的变量,占不同的存储空间,java中怎么在void eat()中调用全局变量age?{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 很给力!

查看全部评分

回复 使用道具 举报
Person类中的第二个age已经不是你在这个类中第一次声明的那个age了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马