在java中创建内部类对象的问题

Posted

技术标签:

【中文标题】在java中创建内部类对象的问题【英文标题】:problem creating object of inner class in java 【发布时间】:2011-07-13 11:28:09 【问题描述】:

这是代码。

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.

谁能告诉我原因?

谢谢

【问题讨论】:

阅读这里。 ***.com/questions/290884/… 和 ***.com/questions/926822/… main是一个静态方法,它只能访问外部类的其他静态成员。 【参考方案1】:

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();
   

【讨论】:

你也可以在一行中完成" InnerClass ic1 = new Test().new InnerClass(); "【参考方案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 的第二个代码块以获取实例化示例。由于内部类绑定到外部类的实例,因此它们可以访问与该特定实例相关的每个字段。

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

【讨论】:

Declaring InnerClass to static 有效,我根据报错信息试了一下。但我还是不明白为什么。你能解释更多吗? @bunkdeath 给定的链接应该足以理解原因,但我会稍微更新一下我的答案。 @herbalessence skaffman 没有解释任何内容,他只是给出了工作代码。【参考方案3】:

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

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

【讨论】:

以上是关于在java中创建内部类对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

java 面向对象内部类和接口

Java内部类

java 内部类

Java类加载器

内部类创建对象需要注意

尝试在将文本文件分成部分的对象类中创建函数(Java)