![](/img/trans.png)
[英]Why can't we create instance of Collections class (not Collection Interface)?
[英]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();
}
没有初始化程序块,可以遵循以下两个选项:
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.