我是Java的新手(有C#经验),
这就是我想要做的:
public final class MyClass
{
public class MyRelatedClass
{
...
}
}
public class OtherRandomClass
{
public void DoStuff()
{
MyRelatedClass data = new MyClass.MyRelatedClass();
}
}
Run Code Online (Sandbox Code Playgroud)
这在Eclipse中给出了这个错误:
不能访问BitmapEffects类型的封闭实例.必须使用BitmapEffects类型的封闭实例限定分配(egxnew A(),其中x是BitmapEffects的实例).
这在C#中可以使用静态类,这里应该怎么做?
mat*_*t b 19
你定义的方式MyRelatedClass,你需要有一个实例 MyClass才能够访问/实例化这个类.
通常在Java中,当MyRelatedClass需要访问实例的某些字段MyClass(因此在编译器警告中引用"封闭实例")时,您会使用此模式.
这样的东西应该编译:
public void doStuff() {
MyClass mc = new MyClass();
MyRelatedClass data = mc.new MyRelatedClass();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果MyRelatedClass实例不需要访问其封闭实例(MyClass的字段)的字段,那么您应该考虑将其定义MyRelatedClass为静态类,这将允许您发布的原始代码进行编译.
嵌套类(你发布的内容)和静态嵌套类(a static class中的a class)的区别在于前者,嵌套类属于父类的实例,而后者没有这种关系 -只有逻辑/命名空间关系.
回应有关将多个类打包在一个文件中的评论:与 .NET 不同,大多数 java 实现都强制公共类类型的名称与声明类类型的文件名之间存在严格的关联。硬性要求,但未使用未强制执行相关性的系统。JLS - 7.6 顶级类型声明是这样说的:
\n\n\n\n\n当包存储在文件系统 (\xc2\xa77.2.1) 中时,主机系统可能\n 选择强制执行这样的限制:如果在下面的文件中找不到类型\n,则会出现编译时错误由类型名称加上扩展名(例如 .java 或 .jav)组成的名称(如果满足以下任一条件):
\n\n\n
\n- 该类型由声明该类型的包的其他编译单元中的代码引用。
\n- 该类型被声明为公共(因此可以从其他包中的代码访问)。
\n
请参阅这个问题:multiple class statements in one file
\n\n如果您希望创建一个命名空间来包含相关的类,那么您需要使用静态内部类。静态声明并不意味着一个实例 - 它们仍然可以被实例化 - 这static意味着它们可以在不需要引用封闭类的情况下被实例化。由于封闭类仅用于分组,而不是数据,因此您可以安全地将其设置为静态。为了更清楚地表明封闭类仅用于分组,您应该将其声明为interface,以便它无法实例化并且没有实现细节。
尽管就我个人而言,我不会这样做——在 Java 中,包用于强制命名空间。为此使用内部类很快就会变得很麻烦。(我已经试过了!)
\n| 归档时间: |
|
| 查看次数: |
16553 次 |
| 最近记录: |