如果我有这段代码。
public class Test{
{
class People {
}
}
public static void main(String[] args) {
People person = new People();//Compile ERROR
}
}
我无法创建人物实例。
这是否意味着初始化程序块不能用于定义类?
答案 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();
}
如果没有初始化程序块,您可以使用以下两个选项:
People
类声明为静态在第一种情况下,唯一改变的是行
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();
}
}