gpt4 book ai didi

java - main 方法中的初始化程序 block ?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:12 25 4
gpt4 key购买 nike

我对类中使用的初始化 block 略知一二。但是我遇到了这个问题:

 //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);
}
}

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

最佳答案

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

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

这一直用于需要多个语句作为一个单元执行的构造中。例如:

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

block 语法可能看起来不寻常,但是,当在没有控制语句的情况下单独使用时:

// 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);
}}
}}

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

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

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

class Bar
{
static Foo myFoo;

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

...
}

附录

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

关于java - main 方法中的初始化程序 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41635837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com