主方法里面的初始化块?

时间:2017-01-13 13:33:56

标签: java

我对类中使用的初始化块有所了解。但我遇到了这个问题:

 //What is the output of the following program?

 public class Test {
    private static int i = 0;
    private static int j = 0;
    public static void main(String[] args) {
        int i = 2;
        int k = 3;

        // What is this thing, that appears to be like an initializer block inside the main method?
        {
            int j = 3;
            System.out.println("i + j is " + i + j);
        }

        k = i + j;

        System.out.println("k is " + k);
        System.out.println("j is " + j);
    }
}

我的问题是:这是什么东西,看起来像是主方法中的初始化块?

2 个答案:

答案 0 :(得分:3)

总结对于偶然发现此问题的其他人的评论: {}是一个定义范围的块。在此特定示例中,块内j的值将为3.但是块外的值将为零。这会导致不同的结果。

另请注意,此语句System.out.println("i + j is " + i + j);只会打印

  

“i + j是23”

而不是

  

“i + j为5”

这是因为+运算符只会将所有整数转换为其字符串表示形式并附加它们。 如果你想要它的声明应该实际上是: System.out.println("i + j is " + (i + j));

答案 1 :(得分:3)

[此答案面向更广泛的新手观众]

在方法中,用{ }括号括起来的一组声明和语句是 复合语句 ,也称为 块声明 或只是 。它创建了一个嵌套在方法体内当前范围内的新范围。

在需要将多个语句作为一个单元执行的构造中始终使用它。 E.g:

if (a > b)
{                   // Block
    int tmp = a;    // 'tmp' is local to this block
    a = b;
    b = tmp;
}

块语法可能看起来不常见,但是在没有控制语句的情况下单独使用

// Bare block with no controlling if/else/for/while/do/switch
{
    int t = frob(b);
    b = frob(a);
    a = flub(t, a);
}

这类事情通常是为了在自己的范围内隔离一大堆代码,特别是如果它使用了父方法中其他任何地方都不需要的大量局部变量。

当然,这种语法可能会被过度使用:

void froodle(int a, int b)
{{
    if (a < 0  ||  a < b)
    {{
        frob(-a, b);
        frob(b, 0);
    }}
}}

虽然{{ }}双括号看起来不寻常,但它们只是定义嵌套在另一个块中的块。在上面的代码中,整个方法体包含一个语句,它本身就是一个块。为清楚起见,这可以改写为:

void froodle(int a, int b)
{
    {
        if (a < 0  ||  a < b)
        {
            {
                frob(-a, b);
                frob(b, 0);
            }
        }
    }
}

块语法是一种特殊情况,它出现在类定义中,但不是在方法体内。在这些情况下,它是类初始化程序,即在首次加载和初始化类时执行的代码块。就好像块是一个特殊的未命名函数的主体,它在类加载时执行。

class Bar
{
    static Foo  myFoo;

    // Class initializer
    static
    {
        myFoo = new Foo(100);
        myFoo.freeble(200);
    }

    ...
}

<强>附录

请注意,类初始化块在它之前需要一个static关键字(我在上面的示例代码中添加了它)。另请注意,代码只能访问类中的static成员和方法。