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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

浅易

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 浅易 初级黑马   /  2015-10-25 14:05  /  2987 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
为什么全局变量会自动赋值而局部变量就不会

最佳答案

查看完整内容

我觉得吧,只要是在类的{}内直接定义的变量就是全局变量,而局部变量是除了在类{}中直接定义的变量之外的变量。全局变量在类加载的时候会进行初始化,而局部变量不会,java就是这么规定的。。。。著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在 ...

7 个回复

倒序浏览
我觉得吧,只要是在类的{}内直接定义的变量就是全局变量,而局部变量是除了在类{}中直接定义的变量之外的变量。全局变量在类加载的时候会进行初始化,而局部变量不会,java就是这么规定的。。。。著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。
  1. for (int i = 0; i < 10; i++) {     int n;     if (i % 2 == 0) {         n = 10;     } else {         n = 20;     } }
复制代码
像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)
回复 使用道具 举报
意思是java就是这么设计的吗??
回复 使用道具 举报
全局变量是在整个程序中都有效,只要出现全部变量中定义的变量都自动赋值,而局部变量只在定义中有效,出了定义中的范围就不自动定义,局部变量义不在正在程序中有效所以不会自动定义。,
回复 使用道具 举报
因为全局变量储存在堆里面,对象一new初始化就会默认赋值。而局部变量储存在栈里面,用完就出栈,是不会有自动赋值的。主要是储存位置的不同,堆里面的成员会有默认赋值。
回复 使用道具 举报
流连忘返 来自手机 中级黑马 2015-10-25 22:35:42
地板
就是在方法内定义的变量
回复 使用道具 举报
这个答案好标准 啊
回复 使用道具 举报
学习了!其实个人有点不同意java中的变量叫全局变量(因为这是C中的定义,面向对象的封装作用就是为了解决全局变量被随处调用,状态不定的问题);其实java中就两种变量:
1、代表类属性的成员变量(存储在java的堆中,一般都是需要在构造函数中进行初始化的,如果不初始化,就像上面说的jdk会在编译的时候自动初始化为默认值;);通过包(命名空间)和修饰符限定访问的权限,实现限制性的调用,实现稳定性。
2、方法中的局部变量(存储在java的栈中,一般都是需要我们自己初始化,以确保不会存在什么bug,没有初始化局部变量而引起的bug在C编程中很常见);需要我们注意的就是它的作用域。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马