繁体   English   中英

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

[英]How can I create a new class instance from a class within a (static) class?

我是Java的新手(有C#经验),

这就是我想要做的:

public final class MyClass
{
    public class MyRelatedClass
    {
      ...
    }
}

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

这在Eclipse中给出了这个错误:

不能访问BitmapEffects类型的封闭实例。 必须使用BitmapEffects类型的封闭实例限定分配(egxnew A(),其中x是BitmapEffects的实例)。

这在C#中可以使用静态类,这里应该怎么做?

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

通常在Java中,当MyRelatedClass的实例需要访问MyClass实例的某些字段时(因此在编译器警告中对“封闭实例”的引用),您使用此模式。

这样的东西应该编译:

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

但是,如果MyRelatedClass实例不需要访问其封闭实例( MyClass的字段)的字段,那么您应该考虑将MyRelatedClass定义为静态类,这将允许您发布的原始代码进行编译。

在具有嵌套类(您已发布的信息)和静态嵌套类(一的区别static class A内class )是在前者中,嵌套类属于父类的实例 ,而后者则没有这种关系 - 只有逻辑/命名空间关系。

尝试将MyRelatedClass定义为静态。

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

回应关于在一个文件中打包多个类的注释:与.NET不同,java的大多数实现强制公共类类型的名称与声明类类型的文件名之间的严格关联。这不是一个硬性要求,但未使用未强制执行相关性的系统。 JLS - 7.6顶级类型声明说:

当包存储在文件系统(第7.2.1节)中时,如果在由类型名称加上名称的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则为扩展名(例如.java或.jav):

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

看到这个问题: 一个文件中有多个类声明

如果您希望创建一个名称空间来包含相关的类,那么您需要使用静态内部类。 静态声明并不意味着一个实例 - 它们仍然可以被实例化 - static意味着它们可以被实例化而无需引用封闭类。 由于封闭类仅用于分组,而不是数据,因此您可以安全地将其设置为静态。 为了更清楚地表明封闭类仅用于分组,您应该将其声明为interface ,以便它不能被实例化并且没有实现细节。

虽然就个人而言,我不会这样做 - 在Java中,包用于强制执行命名空间。 使用内部类很快就变得很麻烦。 (我试过了!)

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

  1. 像Mervin建议的那样使嵌套类静态化,或者
  2. 使用外部类的实例创建它,如错误消息所示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM