为什么不能在Java中创建本地类的实例?

时间:2014-03-14 19:11:54

标签: java class field local-class

如果我有这段代码。

public class Test{
        {
            class People {

            }
        }

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

    }

我无法创建人物实例。

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

5 个答案:

答案 0 :(得分:6)

(添加第二个答案,因为我的错误一个已经有三个upvotes。)

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

public class Test {
    {
        class People {            
        }

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

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

我不能说我以前做过这件事,我也不能想象自己想要很快做到这一点。请注意,这是一个local class,它总是隐式地是一个内部类。 (虽然如果你在静态方法中声明一个本地类,那么就没有封闭的实例,只是为了使术语有点奇怪......)

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

答案 1 :(得分:2)

你需要创建内部类static

static class People {

答案 2 :(得分:1)

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

{
   class People {
   }

   People person = new People();
}

如果没有初始化程序块,您可以使用以下两个选项:

  1. People类声明为静态
  2. 创建一个Test对象,然后实例化一个People对象
  3. 在第一种情况下,唯一改变的是行

    static class People
    

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

    public static void main(String[] args) {
        People person = new Test().new People();
    }
    

答案 3 :(得分:1)

你可以做到

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

因为人们没有封闭的实例

修改

由于类定义位于初始化块中,因此它只在本地可见且可用,在初始化块中(这使得它成为定义类的特殊位置)。由于People没有可见的类型,因此main类无法在People中显示。我在上面概述的方法只有在类定义周围没有初始化块时才会起作用。

答案 4 :(得分:0)

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

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