为什么类的基本类型成员变量不须赋值,而基本类型的局部变量必须赋值?

bigbro001 2010-12-24 10:18:14
在main方法中声明一个基本类型的局部变量后,如果没有给该变量赋值,编译时则会报错,如下面代码所示。
在main方法中声明一个类,这个类包含基本类型的成员变量,即使不给该成员变量赋值,也不会出现编译错误,因为类的成员变量有默认的初始值。

问题就来了:
为什么Java可以为类中的基本类型成员变量提供默认的初始值,但是却不为基本类型的局部变量提供初始值?请问这种设置背后的原因是什么?


public class Student {
public static void main(String[] args)
{
//int age; 此行编译时报错
Student stu = new Student();
System.out.println(stu.stuAge);//此行编译通过,stuAge取默认初始值0
}
int stuAge;
}
...全文
587 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
aotian16 2010-12-24
  • 打赏
  • 举报
回复
我记得不会出错的
geinimaichide 2010-12-24
  • 打赏
  • 举报
回复
不会报错的
qybao 2010-12-24
  • 打赏
  • 举报
回复 1
再补充一下
因为成员变量有可能很多成员方法都用到,而且那个成员方法会先被调用根本不清楚,如果每个成员方法都要初始化才能检查通过的话,那么就造成开发的不方便,而且也不能让某个方法修改的成员变量的值适用于另一个方法(因为不知道是另一个方法先调用还是某个方法先调用,如果是另一个方法先调用按照规定不初始化就不能检查通过,在另一个方法初始化就没什么意义了),所以,为了避免这些种种的不便,系统就为成员变量使用默认值(不赋值的前提下)。
而方法内的局部变量,跟大多数编译器一样,不会自动分配默认值,像C那样的话,不赋初始值就会直接使用该堆栈的当时的状态的值,这样有可能会造成危险,java为了避免这些,所以做了严格的检查,所以当使用这些局部变量时,如果没有初始化,系统会警告。
sunyiz 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bigbro001 的回复:]
请问为什么Java不能像给类成员变量提供初始值那样,也给方法内部的变量赋初始值呢?
[/Quote]

个人理解是,java是出于资源优化和执行效率的考虑,
才对局部变量不进行自动初始化,
用到时再分配内存,用不到立刻释放
如果用到时发现没有初始化,
java还要再自动给它初始化一个值出来,
这样对效率上或多或少会有影响吧

而类的成员变量,
java出于安全性的考虑,
会自动初始化一个值
浪漫江湖 2010-12-24
  • 打赏
  • 举报
回复 1
我不知道这样说对不对,打个比方说吧,声明了一个小汽车类,那么车轮就是它的一个属性吧。所以车轮的值是java默认的,当然你也可以去改变。而你在另外又声明了一个车轮的话,那你就得定义它的类型并赋一个初始值。这也是java灵活的地方。这也是java内部编译器的一个机制。
mengyalizuopeng 2010-12-24
  • 打赏
  • 举报
回复
楼主说的应该是如果在方法内部定义了一个变量,如果没有初始化
当用到这个变量时,会报错吧?
这和静态不静态没有关系,而是和变量是类成员变量,还是在方法内部有关系
类的成员变量在类加载的时候自动初始化,而在方法内部时就要你去初始化了
qybao 2010-12-24
  • 打赏
  • 举报
回复
这是好像是规定的。java相对安全性比较高,所以对类型,赋值的检查比较严格。
一个对象初始化时,如果没有给成员变量赋值,系统会自动使用默认值赋值,相当于一个对象的初始状态,这也是可以理解的。而且很多方法可能会用到该成员,不同的方法可能是由不同的人维护修改时追加的,而需要不需要重新赋初始值,后来维护的人也不一定清楚(因为可能以前的开发的人在某个方法里设置初始值了),这样如果没有自动使用默认值,那么很多新追加的使用该成员的方法如果不初始化该成员,检查就不能通过(即编译不过),这样造成维护的太多不方便。
而方法里的变量,因为方法是由开发维护者自己管理的(也就说跟其他方法无关),所以系统就交由开发维护者自己控制,因为要赋什么值,有何用途系统不清楚。但是因为java的检查很严格,所以,开发维护者忽略赋值时,系统会提醒(即编译不过)。
纯属个人看法。
bigbro001 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunyiz 的回复:]

楼主说的应该是如果在方法内部定义了一个变量,如果没有初始化
当用到这个变量时,会报错吧?
这和静态不静态没有关系,而是和变量是类成员变量,还是在方法内部有关系
类的成员变量在类加载的时候自动初始化,而在方法内部时就要你去初始化了
[/Quote]

是俺的错,的确是用到这个变量时才会报错,不用的话不会报错
bigbro001 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunyiz 的回复:]

楼主说的应该是如果在方法内部定义了一个变量,如果没有初始化
当用到这个变量时,会报错吧?
这和静态不静态没有关系,而是和变量是类成员变量,还是在方法内部有关系
类的成员变量在类加载的时候自动初始化,而在方法内部时就要你去初始化了
[/Quote]

请问为什么Java不能像给类成员变量提供初始值那样,也给方法内部的变量赋初始值呢?
bigbro001 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyiz 的回复:]

会报错嘛?不会吧
[/Quote]

刚刚试了试,在eclipse中不会报错,但在cmd中用javac编译就会报错
sunyiz 2010-12-24
  • 打赏
  • 举报
回复
楼主说的应该是如果在方法内部定义了一个变量,如果没有初始化
当用到这个变量时,会报错吧?
这和静态不静态没有关系,而是和变量是类成员变量,还是在方法内部有关系
类的成员变量在类加载的时候自动初始化,而在方法内部时就要你去初始化了
Talin 2010-12-24
  • 打赏
  • 举报
回复
成员变量在对象中,在内存的堆区,局部变量在栈区,执行完该方法就没有了。成员变量在类加载的时候初始化
zhuzeitou 2010-12-24
  • 打赏
  • 举报
回复
类被实例化的时候,内存就分配了相应的空间,没有赋初值的成员变量就被置0,所以成员的默认值数值型的都是0,布尔型的是false,对象是null
sunyiz 2010-12-24
  • 打赏
  • 举报
回复
会报错嘛?不会吧

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧