这是代码。
public class Test {
class InnerClass{
}
public static void main(String[] args){
InnerClass ic = new InnerClass();
}
}
它说错误信息
non-static variable this cannot be referenced from a static context
after creation of object ic.
有谁可以给我理由?
由于
答案 0 :(得分:23)
InnerClass
本身需要static
,即
public class Test {
static class InnerClass{
}
public static void main(String[] args){
InnerClass ic = new InnerClass();
}
}
如果InnerClass
不 static
,则只能在Test
的父实例的上下文中进行实例化。相当巴洛克式的语法是:
public class Test {
class InnerClass{
}
public static void main(String[] args){
Test test = new Test();
InnerClass ic = test.new InnerClass();
}
}
答案 1 :(得分:2)
您的内部类依赖于Test
类的实例。 main是静态方法,因此您无法创建InnerClass
。
我认为您要将内部类声明为static
:
class Test {
static class InnerClass { }
public static void main(String[] args){
InnerClass ic = new InnerClass();
}
}
有关嵌套类的更多信息:http://download.oracle.com/javase/tutorial/java/javaOO/nested.html
主要有两种类型的嵌套类:“静态嵌套类”和“内部类”
静态嵌套类用于逻辑分组两个类,可用于增加封装。它们可以像任何其他类一样使用,除了可见性之外,它们对外部类字段没有任何特定的访问权限。它们可以在逻辑上在静态上下文中实例化。
内部类(即非静态)绑定到外部类的特定实例。这意味着您必须具有外部类的实例来实例化内部类。看看Skaffman的第二个代码块用于实例化示例。由于内部类绑定到外部类的实例,因此它们可以访问相对于此特定实例的每个字段。
我希望现在所有这一切都更加清晰。
答案 2 :(得分:0)
首先,“嵌套”类是静态的,而“内部”类则不是。
静态类在封闭类的所有实例之间共享(因此静态字段在所有实例之间共享),而每个实例都有自己的非静态内部类的版本。
非静态内部类与封闭对象(而不是类)一起存储,并且只能通过实例访问。