7


这是代码。

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.

谁能给我理由?

谢谢

4

3 回答 3

25

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();
   }
}
于 2011-03-11T12:39:34.060 回答
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

简短说明

嵌套类主要有两种类型:“静态嵌套类”和“内部类”

静态嵌套类用于对两个类进行逻辑分组,可用于增加封装性。它们可以像任何其他类一样使用,并且除了可见性之外,它们对外部类字段没有任何特定的访问权限。它们可以在静态上下文中进行逻辑实例化。

内部类(即不是 static绑定到外部类的特定实例。这意味着你必须有一个外部类的实例来实例化内部类。查看 Skaffman 的第二个代码块以获取实例化示例。由于内部类绑定到外部类的实例,因此它们可以访问与此特定实例相关的每个字段。

我希望这一切现在都更清楚了。

于 2011-03-11T12:40:04.487 回答
0

首先,“嵌套”类是静态的,而“内部”类不是。

静态类在封闭类的所有实例之间共享(因此静态字段在所有实例之间共享),而每个实例都有自己的非静态内部类版本。
非静态内部类与封闭对象(而不是类)一起存储,并且只能通过实例访问。

于 2011-03-11T12:42:50.913 回答