当前位置: 首页 > 知识库问答 >
问题:

为什么嵌套类在Java和C#之间表现不同?

邹正阳
2023-03-14

我不明白为什么下面的代码在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常量=new InnerClass(5);部分。错误有:

I:\documents\netbeansprojects\testingground\src\testingground\TestClass.java:22:错误:非静态变量这不能从静态上下文引用public static final TestClass常量=new InnerClass(5);^I:\documents\netbeansprojects\testingground\src\testingground\TestClass.java:22:错误:内部类TestClass.InnerClass public static final TestClass常量=new InnerClass(5);^修饰符“static”仅在常量变量声明中允许2错误

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不允许这样做?

共有1个答案

公西良骏
2023-03-14

要创建一个内部类(与嵌套静态类相反),需要一个封闭类的实例--在本例中没有。请注意,在C#中没有直接等效的内部类--C#中的嵌套类更像是Java中的嵌套静态类,C#中类声明中static的含义与Java中类声明中static的含义完全不同。

备选案文1

如果您真的希望它是一个内部类,可以写:

public static final TestClass CONSTANT = new SomeConcreteTestClass().new InnerClass(5);
public static final TestClass CONSTANT = ((TestClass) null).new InnerClass(5);
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 = ((TestClass) null).new InnerClass(5);
}
public static final class InnerClass extends TestClass
 类似资料:
  • 问题内容: 以下代码在Java 8和9中都可以编译,但是行为不同。 当我使用Java 8运行它时,它返回: 但是当我用Java 9运行它时,输出却不同: 为什么? 问题答案: 在Java文档是Unicode标准的一致性出来。Javadoc弄混了应该匹配的内容。内容为: 任何Unicode换行符序列都等效于 该Java文档是错误的。在R1.6换行符的小节中,有关正则表达式的Unicode技术标准#1

  • 问题内容: 我正在查看Java代码,并注意到它使用了静态嵌套类。 使用静态嵌套类而不是普通内部类的原因是什么? 我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。 但是我认为可能还有其他原因,也许是性能。可能是什么? 注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/t

  • 问题内容: 在Java中,嵌套类是什么,它们做什么? 问题答案: 它们只是其他类中的类。它们使类的层次结构成为可能,如果您将它们设为私有,则这是一种使用它们封装不在类外部公开的数据的便捷方法。Sun有一个简短的教程关于他们

  • 问题内容: 什么时候嵌套类可行?我看到的最常见的优点是“共享范围”(跨类使用变量)。 这是否比仅将嵌套类放入其自己的文件中并通过构造函数传递参数更具吸引力/最佳实践少? 问题答案: 使用嵌套类的原因有很多,其中包括: 这是一种对仅在一个地方使用的类进行 逻辑分组 的方法。 它增加了 封装 。 嵌套类可以导致更具 可读性和可维护性的代码 。 子级到父级的连接更为简单,因为它 直观地说明 了每个类的变

  • 问题内容: 我们注意到,用C#(或Java)开发的软件中的许多错误都导致NullReferenceException。 为什么在语言中甚至包含了“ null”? 毕竟,如果没有“ null”,那么我就不会有错误,对吧? 换句话说,如果没有null,该语言的什么功能将无法正常工作? 问题答案: “ C#父亲” Anders Hejlsberg在他的《计算机世界》采访中谈到了这一点: 例如,在类型系统

  • 问题内容: 今天,我刚刚发现了一个问题,因为我的一个单元测试由于从Java 7升级到Java 8而失败了。该单元测试调用一个方法,该方法试图在子类上注释的方法上找到注释,但返回类型不同。 在Java 7中,似乎只有在代码中确实声明了注释时,才会找到注释。在Java 8中,似乎包含在子类中声明的注释。 为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPre