繁体   English   中英

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

[英]Why can't create instance of local class in Java?

如果我有此代码。

public class Test{
        {
            class People {

            }
        }

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

    }

我无法创建人的实例。

这是否意味着不能将Initializer Block用于定义类?

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

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

public class Test {
    {
        class People {            
        }

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

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

我不能说我曾经做过此事,也不能想象自己想在不久的将来做这件事。 请注意,这是一个本地类 ,它始终隐式为一个内部类。 (尽管如果您在静态方法中声明了本地类,则没有封闭的实例,只是使术语有点奇怪...)

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

您需要将内部类设为static

static class People {

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

{
   class People {
   }

   People person = new People();
}

没有初始化程序块,可以遵循以下两个选项:

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

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

static class People

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

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

你可以做

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

因为People否则没有封闭实例

编辑:

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

是的,我们可以声明类的初始化程序块和范围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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM