我们知道Java中每种原始数据类型都有一个默认值(例如: - double数据类型的默认值是0.0d。)然后如果我们想要一个变量的值(假设 double) a )等于默认值,为什么我们需要将值指定为:
double a=0.0d;
为什么我们不能只使用变量的默认值,因为它的默认值与我们想要分配的值相同?
答案 0 :(得分:2)
不同类型的默认值将分配给该类型的任何未分配字段。但是,这不适用于局部变量,如Language Specification §4.12.5:
所示必须明确赋予局部变量(§14.4,§14.14)一个值 在使用之前,通过初始化(§14.4)或赋值 (§15.26),可以使用明确规则进行验证 赋值(§16(定义赋值))。
我推测这是为了让你的代码更清晰。在一种方法中,您希望代码的读者知道每个变量的值是什么,而不是依赖于读者记住诸如“boolean
的默认值为false
”之类的事实。由于您所编写的内容可能是某种算法,因此您希望尽可能清楚地为其他人编写。
但是在字段中,这不是必需的。我认为这是因为你没有描述一系列做某事的步骤。相反,你只是说这个对象有一些属性。语义在这里有点不同。
答案 1 :(得分:0)
根据Java语言规范,必须在使用前启用局部变量。让我们看看为什么会对局部变量而不是实例变量做出这样的规则。
编译器尝试在编译期间消除尽可能多的错误,从而使应用程序运行时更稳定。为此,它在编译时检测到它可以解决的问题并抛出编译时异常。
非最终实例变量可以在构造函数(可能是多个,重载)或类的其中一个方法中初始化。在使用这样的变量编译器之前不会抱怨,因为它假定程序员会在某些方法或构造函数中提供初始值。启动取决于应用程序的运行时间,因为在运行时可以调用一个方法,如果程序员不提供值,则启动并因此编译时间检测,因此编译器选择允许使用的安全选项并提供
中没有调用处理启动的方法或构造函数的默认值。非最终局部变量只能在其方法中启动。如果用户想要使用默认值,则制作非最终变量没有多大意义。直接使用该值或使用final关键字更有意义。如果已使用非最终局部变量,则编译器强制用户提供初始值,该初始值可能是也可能不是默认值。
对于实例级别和本地的最终字段,编译器强制用户提供初始值。
答案 2 :(得分:0)
您需要初始化根据java语言规范声明为final的局部变量或类级变量。它们不会使用默认值进行初始化。