为什么全局变量无须初始化 系统自动给默认值,局部变量必须初始化?

基本数据类型

数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)

下面是默认值:

0/0/0/0/0.0/0.0/ /false

  1. 首先 Java 语言就是这么规定的。
  2. 然后为什么 Java 语言要这么规定呢?有什么内部机理吗?

可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。
而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。
那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。

作者:Intopass
链接:https://www.zhihu.com/question/30516949/answer/48369234
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

时间: 2024-12-28 01:37:48

为什么全局变量无须初始化 系统自动给默认值,局部变量必须初始化?的相关文章

C++系统自动生成默认构造函数的情况

(1) 基类存在默认构造函数 class CBaseClass { public: CBaseClass() { m_i = 0; } private: int m_i; }; class CDriveClass: public CBaseClass { public: void func() { } private: }; (2) 成员变量存在默认构造函数 class CTestClass { public: CTestClass() { m_i = 1; } private: int m_i

Python 调用让系统自动调用默认程序打开文件?

windows上可以使用os.startfile os.startfile(file) linux上可以使用xdg-open subprocess.call(["xdg-open", file]) mac os上可以使用open subprocess.call(["open", file])

SQL Server 重新初始化系统数据库中的单引号问题

在最近的数据库跨机房迁移中,由于硬件的限制,需要滚动式地将数据库一台台迁移到新机房,先在新机房搭建一个新环境,将数据迁移过去,再将旧机房的机器下架搬到新机房,重新配置后用于下一轮的升级,重新配置过程中,有以下几个问题: 1:由于机房和IP已经发生变化,因此需要按照命名规则修改服务器名称. 2:原数据库上的数据如登录账号/作业/链接服务器等等需要删除 3:部分服务器因磁盘变动,仅保留系统盘,部分SQL Server文件(如果系统数据库文件)已经丢失 对于问题1和问题2,可以进行手动删除或者写个脚本

C#4.0语法糖之第三篇: 参数默认值和命名参数 对象初始化器与集合初始化器

今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完善以及自我提高,给各位园友们带来更好,更高效的文章. 废话就说到这里,下面正式进入我们的今天的C#4.0语法糖,今天给大家分享一下参数默认值.命名参数.对象初始化器和集合初始化器. 参数默认值和命名参数:方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合

为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?

代码如下 1.局部变量,报错!!! public void test(){ int i; System.out.println(i); } 2.成员变量,输出0 int i; @Test public void test(){ System.out.println(i); } 之前一直有疑问,但是也不知道具体是什么原因,今天看了thinking in java大致就了解了: 其实说到底还是java规范,因为java规定要这样就必须这样==. 原理就是,java规定,所有变量在使用之前要保证是经过

如何使用智能默认值来减少认知负担

作者:Nick Babich 翻译 :吴祺深 欢迎访问网易云社区,了解更多网易技术产品运营经验. 如果你问UX设计师们他们的工作目标是什么,他们可能会说,他们的目标是让用户的生活变得简便.当用户体验设计师设计一款产品,他们会尽最大努力提供能够实现最终结果的最直接的操作路径.虽然这个目标可能听起来很简单,但在现实生活中存在着许多妨碍用户达成目的的障碍.其中一个便让用户停下来思考接下来该如何进行的东西. Steve Krug有句名言:"不要让我思考".如果你想听从他的建议,就需要专注于减少

C++函数带默认值的几种情形

1. 默认参数的规则 默认值定义 C++支持函数参数带默认值.这里所谓的默认值,指的是在调用函数时,可以不指定某些参数,编译器会自动把默认值传递到函数调用中. 默认值位置 指定默认值的参数必须位于形参列表最右端,从右往左.否则会出现二义性,编译器无法处理. 默认值设置 默认值可以在函数声明或函数定义中设置,只要保证不出现参数重定义即可. 2.默认参数示例 在函数声明中设置默认值 这是最常见的一种情形.主要有以下两种声明方式: 声明中给参数赋默认值 声明中用类型指定默认值 float area(f

添加数据时如何向表中插入默认值?

建了一个表,建表SQL语句如下:CREATE TABLE `myuser` (  `uid` int(11) unsigned NOT NULL auto_increment,  `username` varchar(250) NULL default '王兵',  `photo` varchar(250) NULL default '32423342',  PRIMARY KEY  (`uid`),) ENGINE=InnoDB DEFAULT CHARSET=gbk; username和ph

C++的参数默认值和哑元

一. 函数的参数支持哑元 哑元是一种没有参数名的参数,主要是为了函数间的区别以及向前兼容 二. 函数的参数可以指定默认值,当调用时没有传参,就以默认值进行函数调用. 三. 有默认值的形参必须靠右,声明和定义分开时,默认值必需在声明中指定,定义中不再指定. //默认参数 与 哑元 #include <iostream> using namespace std; /* 1 void print(int *a,int n){ for (int i = 0; i<n; i++) { cout &