代码之家  ›  专栏  ›  技术社区  ›  Mervin

如何从(静态)类中的类创建新的类实例?

  •  7
  • Mervin  · 技术社区  · 14 年前

    这就是我想做的:

    public final class MyClass
    {
        public class MyRelatedClass
        {
          ...
        }
    }
    
    public class OtherRandomClass
    {
        public void DoStuff()
        {
           MyRelatedClass data = new MyClass.MyRelatedClass(); 
        }
    }
    

    在Eclipse中会出现以下错误:

    无法访问BitmapEffects类型的封闭实例。必须使用BitmapEffects类型的封闭实例限定分配(例如x.new A(),其中x是BitmapEffects的实例)。

    4 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    7 年前

    作为对将多个类打包到一个文件中的评论的回应:与.NET不同,大多数java实现在公共类类型的名称和声明类类型的文件的名称之间强制执行严格的关联。这不是一个硬性要求,但在没有强制执行相关性的系统中没有使用。JLS公司- 7.6 Top Level Type Declarations 他说:

    当包存储在文件系统中时(§7.2.1),主机系统可能 如果类型 在文件名下找不到 由类型名和 扩展名(如.java或.jav)

    • 该类型由的其他编译单元中的代码引用
    • 类型被声明为public(因此可能是可访问的) 从其他包中的代码)。

    看看这个问题: multiple class declarations in one file

    如果您希望创建一个命名空间来封闭相关的类,那么使用静态内部类就是您所需要的。静态声明并不意味着一个instance-它们仍然可以实例化- static interface ,因此无法实例化,并且没有实现细节。

        2
  •  19
  •   matt b    14 年前

    你定义的方式 MyRelatedClass ,你需要一个 实例 MyClass 能够访问/实例化这个类。

    通常在Java中,当 MyRelated类 类名 实例(因此编译器警告中对“封闭实例”的引用)。

    应该编译如下内容:

    public void doStuff() {
       MyClass mc = new MyClass();
       MyRelatedClass data = mc.new MyRelatedClass(); 
    }
    

    但是,如果 类名 MyRelated类

    有一个嵌套类(您发布的)和一个静态嵌套类(一个 static class 在一个 class )在前者中,嵌套类属于 实例 父类,而后者没有这种关系-只有逻辑/命名空间关系。

        3
  •  4
  •   Nikita Rybak    14 年前

    MyRelatedClass

    编辑
    关于这个问题的更多信息
    http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

        4
  •  0
  •   dsmith    14 年前

    是的,非静态嵌套类可以访问外部类实例成员,因此必须为外部类的实例创建。所以你有两个选择:

    1. 按照Mervin的建议使嵌套类成为静态的,或者

    在实践中,我很少创建内部类的实例,除了在外部类的方法中,我也很少使这些类可变——但这只是我自己。