【发布时间】:2015-05-22 05:06:42
【问题描述】:
我不明白为什么Java中出现以下代码错误:
public abstract class TestClass
{
private final int data;
protected TestClass(int data) { this.data = data; }
public final class InnerClass extends TestClass
{
private InnerClass(int data) { super(data); }
public static final TestClass CONSTANT = new InnerClass(5);
}
}
错误出现在public static final TestClass CONSTANT = new InnerClass(5); 部分。
错误是:
I:\Documents\NetBeansProjects\TestingGround\src\testingground\TestClass.java:22: 错误:非静态变量不能从静态引用 context public static final TestClass CONSTANT = new InnerClass(5); ^ I:\Documents\NetBeansProjects\TestingGround\src\testingground\TestClass.java:22: 错误:内部类 TestClass.InnerClass 中的非法静态声明 public static final TestClass CONSTANT = new InnerClass(5); ^ 修饰符 'static' 只允许在常量变量声明中使用 2 错误
如果我尝试在 C# 中实现相同的效果,它可以正常工作。
public abstract class TestClass
{
private readonly int data;
protected TestClass(int data) { this.data = data; }
public sealed class InnerClass : TestClass
{
private InnerClass(int data) : base(data) { }
public static readonly TestClass CONSTANT = new InnerClass(5);
}
}
为什么 Java 不允许这样做?
【问题讨论】:
-
我已经更新了标题...不幸的是,这使得这个问题与许多类似的问题重复了一次bing.com/…...但 Jon Skeet 回答的并不多 - 所以让我们再找一个 :) 随意改写标题以更好地反映您的问题。
-
@AlexeiLevenkov 没有一个“重复”解决这个特定问题。一个问题是为什么 C# 嵌套类不能像 Java 内部类那样访问其外部类的内部。有人问 Java 静态类和 C# 静态类有什么区别,但从这个问题的给定答案来看,这是一个认知上的飞跃。