我对背后似乎是不一致的原因感到困惑。
例如
public class Test { static int a; public static void main(String[] args) { System.out.println(a); } }
因此,将按预期打印出0。但是说我们有这个
public class Test { public static void main(String[] args) { int a; System.out.println(a); } }
抱怨a尚未初始化,因此无法为我编译。我期望它能打印出0 …
这使我想到了一些问题:
1)为什么作用域变量没有默认值?
2)请问static关键字是原因吗?又为什么呢
Java语言规范解释了变量的默认初始值
每个类变量,实例变量或数组组件在创建时都会用默认值初始化(第15.9节,第15.10节): 对于字节类型,默认值为零,即(byte)0的值。 对于short类型,默认值为零,即(short)0的值。 对于int类型,默认值为零,即0。 对于long类型,默认值为零,即0L。 对于float类型,默认值为正零,即0.0f。 对于double类型,默认值为正零,即0.0d。 对于char类型,默认值为空字符,即’\ u0000’。 对于布尔类型,默认值为false。 对于所有引用类型(第4.3节),默认值为null。
每个类变量,实例变量或数组组件在创建时都会用默认值初始化(第15.9节,第15.10节):
对于字节类型,默认值为零,即(byte)0的值。
对于short类型,默认值为零,即(short)0的值。
对于int类型,默认值为零,即0。
对于long类型,默认值为零,即0L。
对于float类型,默认值为正零,即0.0f。
对于double类型,默认值为正零,即0.0d。
对于char类型,默认值为空字符,即’\ u0000’。
对于布尔类型,默认值为false。
对于所有引用类型(第4.3节),默认值为null。
并指出
必须在使用局部变量(第14.4节,第14.14节)之前通过初始化(第14.4节)或赋值(第15.26节)为它明确赋一个值,并可以使用确定赋值规则(第§1节)进行验证。 16)。
您的两个问题都可以通过“因为JLS如此回答”来回答。
更完整的答案如下:
类是状态和行为的描述。对象是实际数据。如果创建对象,则该对象必须具有确定的状态,不能处于未初始化状态。