2

如果我有这个代码。

public class Test{
        {
            class People {

            }
        }

        public static void main(String[] args) {
            People person = new People();//Compile ERROR
        }

    }

我无法创建 People 实例。

这是否意味着初始化程序块不能用于定义类?

4

5 回答 5

6

(添加第二个答案,因为我的错误答案已经有 3 个赞成票。)

可以在初始化程序块中声明一个类 - 但它的范围是该初始化程序块,就像您在方法中声明它一样。所以这有效:

public class Test {
    {
        class People {            
        }

        People people = new People();
        System.out.println("In initializer block!");
    }

    public static void main(String[] args) {
        new Test();
    }
}

我不能说我以前做过这个,我也无法想象自己很快就会这样做。请注意,这是一个本地类,它始终隐含地是一个内部类。(虽然如果你在静态方法中声明一个本地类,没有封闭的实例,只是为了让术语有点奇怪......)

如果你想创建一个在初始化块之外的代码可以“看到”的类,你需要在初始化块之外声明它。(就像任何其他声明一样 - 如果您在初始化程序块中声明了一个变量,您不会期望能够在外面看到它吗?)

于 2014-03-14T19:16:11.973 回答
2

您需要制作内部类static

static class People {
于 2014-03-14T19:15:18.167 回答
1

你可以做

Test t = new Test();
People person = t. new People();

因为 People 没有封闭实例

编辑:

由于类定义在初始化块中,因此它只能在本地可见和可用,在初始化块内部(这使得它成为定义类的特殊位置)。该类People在 中不可见,main因为 没有可见类型People。我上面概述的方法只有在类定义周围没有初始化块的情况下才有效。

于 2014-03-14T19:26:59.323 回答
1

初始化程序块(由额外的括号定义)更改了声明类的范围,因此它不会在外部可见,就像变量不可见一样。People因此,可以创建对象的唯一位置是块本身,例如

{
   class People {
   }

   People person = new People();
}

如果没有初始化程序块,您可以遵循 2 个选项:

  1. 将类声明People为静态
  2. 创建一个 Test 对象,然后实例化一个 People 对象

在第一种情况下,唯一改变的是行

static class People

对于第二种情况,该main方法看起来像

public static void main(String[] args) {
    People person = new Test().new People();
}
于 2014-03-14T19:16:35.053 回答
0

是的,我们可以声明初始化块和 People 类的范围将在其中。更新代码如下:

  public class Test {
    {
        class People {  
             /// Stuff          
        }

        People people = new People(); // Create object of People
        System.out.println("Initializer block");
    }

    public static void main(String[] args) {
        Test obj = new Test();
    }
}
于 2014-03-14T19:17:56.193 回答