当前位置: 首页 > 面试题库 >

Java默认值混乱,为什么没有函数作用域变量?

许正平
2023-03-14
问题内容

我对背后似乎是不一致的原因感到困惑。

例如

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。

并指出

必须在使用局部变量(第14.4节,第14.14节)之前通过初始化(第14.4节)或赋值(第15.26节)为它明确赋一个值,并可以使用确定赋值规则(第§1节)进行验证。
16)。

您的两个问题都可以通过“因为JLS如此回答”来回答。

更完整的答案如下:

类是状态和行为的描述。对象是实际数据。如果创建对象,则该对象必须具有确定的状态,不能处于未初始化状态。



 类似资料:
  • 我正在准备JavaOCA认证,遇到了一个类似的问题,如下所示: 按照Java,实例和静态变量被赋予默认值。令人惊讶的是,我的控制台上显示的错误是: 为什么没有在上面分配默认值?

  • 问题内容: 为什么在类中声明的变量具有默认值,但是在方法内部声明的变量(称为“局部变量”)在Java中没有默认值? 例如 在上面的示例中,变量的默认值为0,但是变量给出了可能尚未初始化的错误。 问题答案: 所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值进行初始化。对于局部变量,它们不会被加载到堆中,直到在Java7之前被使用,它们才会存储在堆栈中,因此我们需要显式初始化它们。现在

  • Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的

  • 我在研究JS中变量作用域的概念时,在上面发现了这个例子: 此函数的输出为 现在我很困惑,为什么gets会在第二个日志中获得值3。即使在语句中使用声明时也是如此。在中声明的不是应该在中获得一个新实例吗?

  • 问题内容: 我尝试使用以下方法更改默认参数值: 而所有的SQL预编译器给我的都是这个错误: 消息102,级别15,状态1,过程my_sp,第8行’(’附近的语法不正确。 我已经创建了过程。(我不确定这是否相关。)我使用的是空默认值,以后再检查它,但这似乎不合适。我可以一行完成吗? 更新:我不打算使用MSDN对存储过程参数的描述: [= default]是参数的默认值。如果定义了默认值,则可以在不为

  • 问题内容: 我想问一下最后一句话的意思和作用(导出默认的HelloWorld;),但是我找不到关于它的任何教程。 问题答案: 出口喜欢和进口,比如是一部分ES6模块系统。 模块是一个独立的单元,可以使用将资产暴露给其他模块,并使用来从其他模块获取资产。 在您的代码中: 在ES6中,有两种导出: 命名出口 -例如,是名称为的命名出口。可以使用导入命名模块。在这种情况下,导入的名称应与导出的名称相同。