黑马程序员技术交流社区

标题: 成员变量,局部变量 [打印本页]

作者: 姿_`态    时间: 2014-6-11 08:39
标题: 成员变量,局部变量
本帖最后由 姿_`态 于 2014-6-12 09:07 编辑

为什么成员变量可以不先赋初值,也可以使用,但是局部变量,就会报错。
作者: woshihq    时间: 2014-6-11 08:47
成员变量的作用域是类的内部,而且,它的初始化工作一般交给构造函数,在实例对象的时候才初始化,而局部变量的作用域是局部的,初始化只能在局部内完成
作者: uu993    时间: 2014-6-11 09:05
变量定义时可以不赋值,但是在调用的时候就需要。
成员变量,系统会给他初始化,赋默认值,比如int为0,boolean类型为flase,String类型为null等。
方法里面的变量即局部变量,系统不会给他赋值,在调用之前需要明确给他指定一个值。
报错是因为调用的时候没有值,所以会报错
作者: peku    时间: 2014-6-11 09:12
成员变量系统会先进行默认赋初值操作,一般是null或者0;而局部变量没有这个机制,如果不自己赋初值就没有可以使用的值,所以会报错
作者: 阿布Yocan    时间: 2014-6-11 09:44
局部变量和成员变量主要是他们作用域的区别,
成员变量个是类内部;局部变量是定义其的方法体内部(或者方法体内部的某一程序块内——大括号,主要看定义的位置)。
另外,成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。
还有,在内存中的位置也不一样。成员变量在所在类被实例化后,存在堆内存中;局部变量在所在方法调用时,存在栈内存空间中。
作者: axuan    时间: 2014-6-11 10:36
Java中成员变量有默认初始化,也就是如果不显式设置初始值的话就会被初始化为其类型的默认值(0、false、null等)。
          Java中的局部变量没有默认初始化。为了减少因为缺乏初始化而带来的程序错误隐患,Java要求局部变量在使用前必须显式设置初始值,也就是说在某个变量第一次被读取前在任意代码路径上都必须对它至少有一次赋值操作
作者: 坠花湮    时间: 2014-6-11 14:08
成员变量和局部变量的区别在于其有效范围不同。成员变量在整个类内都有效,而局部变量只在定义它的成员方法内才有效。
另外,成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。
作者: sun_jun    时间: 2014-6-11 21:20
能给个程序吗?
下面的局部变量int b 就没报错!

class Test3
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
                for(int a=0;a<5;a++)
                {
                        int b;
                }
        }
}
作者: 姿_`态    时间: 2014-6-12 08:50
sun_jun 发表于 2014-6-11 21:20
能给个程序吗?
下面的局部变量int b 就没报错!

我知道原因 b没有报错是因为他没有被掉用
class Test3
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
                for(int a=0;a<5;a++)
                {
                        int b;
                  System.out.println(b);//报错,b没有初始化
                }
               
        }
}

作者: 姿_`态    时间: 2014-6-12 08:51
坠花湮 发表于 2014-6-11 14:08
成员变量和局部变量的区别在于其有效范围不同。成员变量在整个类内都有效,而局部变量只在定义它的成员方法 ...

讲解的很好,明白了 ,谢谢啦
作者: 姿_`态    时间: 2014-6-12 08:59
peku 发表于 2014-6-11 09:12
成员变量系统会先进行默认赋初值操作,一般是null或者0;而局部变量没有这个机制,如果不自己赋初值就没有 ...

谢谢啦,这下明白了,
作者: 姿_`态    时间: 2014-6-12 09:00
woshihq 发表于 2014-6-11 08:47
成员变量的作用域是类的内部,而且,它的初始化工作一般交给构造函数,在实例对象的时候才初始化,而局部变 ...

一个在堆区,一个在栈区,堆区一般都不默认初始化,所以要我们自己初始化,谢谢啦
作者: 姿_`态    时间: 2014-6-12 09:02
uu993 发表于 2014-6-11 09:05
变量定义时可以不赋值,但是在调用的时候就需要。
成员变量,系统会给他初始化,赋默认值,比如int为0,bool ...

变量定义时可以不赋值,但是在调用的时候就需要。说得对 ,及解决了我的问题,也解决了下面有一个那哥们的
问题,谢谢啦啊
作者: 姿_`态    时间: 2014-6-12 09:03
阿布Yocan 发表于 2014-6-11 09:44
局部变量和成员变量主要是他们作用域的区别,
成员变量个是类内部;局部变量是定义其的方法体内部(或者方 ...

解释的很清晰,明白了 谢谢啊
作者: 黄宝宝    时间: 2014-6-12 09:03
因为成员变量是会默认初始化的,而局部变量不会!
作者: 姿_`态    时间: 2014-6-12 09:04
axuan 发表于 2014-6-11 10:36
Java中成员变量有默认初始化,也就是如果不显式设置初始值的话就会被初始化为其类型的默认值(0、false、n ...

一个有默认初始化值,一个没有,为了规避错误,必须做赋初值操作,这方法不错,谢谢啦
作者: 姿_`态    时间: 2014-6-12 09:05
坠花湮 发表于 2014-6-11 14:08
成员变量和局部变量的区别在于其有效范围不同。成员变量在整个类内都有效,而局部变量只在定义它的成员方法 ...

讲的很清晰,明白啦,谢谢啦
作者: uu993    时间: 2014-6-12 09:06
姿_`态 发表于 2014-6-12 09:02
变量定义时可以不赋值,但是在调用的时候就需要。说得对 ,及解决了我的问题,也解决了下面有一个那哥们 ...

呵呵,客气~
作者: 四顾行者    时间: 2014-6-12 09:27
成员变量系统会默认赋值,而局部变量不会
作者: 张政    时间: 2014-6-12 09:34
我是来学习的
作者: 会说话的木头    时间: 2014-6-12 09:44
peku 发表于 2014-6-11 09:12
成员变量系统会先进行默认赋初值操作,一般是null或者0;而局部变量没有这个机制,如果不自己赋初值就没有 ...

回答非常准确
作者: 坠花湮    时间: 2014-6-12 10:24
姿_`态 发表于 2014-6-12 09:05
讲的很清晰,明白啦,谢谢啦

加油 ,一起努力

作者: 嗅ㄨiaǒ孑    时间: 2014-6-12 11:03
成员变量:作为类的成员而存在,直接存在于类中。所有类的成员变 量可以通过this来引用。 局部变量:作为方法或语句块的成员而存在,存在于方法的参数列表和方法定义中。
   1.成员变量可以被 public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及 static修饰;两者都可以定义成final型。  
2.成员变量存储在堆,局部变量存储在栈。局 部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许, 还可以在类的外部使用成员变量。   
3.局部变量的生存周期与方法的执行期相同。 当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对 象的生存期相同。而静态成员变量的生存期是整个程序运行期。
   4.成员变量有默认值,基本类型的默认值为 0,复合类型的默认值为null。(被final修饰且没有static的必须显式赋值),局部变量不会自动赋值,所以局 部变量在定义后先要赋初值,然后才能使用。  
5.局部变量可以和成员变量 同名,且在使用时,局部变量具有更高的优先级。
希望能帮到你




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2