Why do nested classes behave differently between Java and C #?

I do not understand why the following code errors in 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);
    }
}

The error is in part public static final TestClass CONSTANT = new InnerClass(5);. Errors:

I: \ Documents \ NetBeansProjects \ TestingGround \ SRC \ testingground \ TestClass.java: 22: error: non-static variable that cannot be referenced from static context public static final TestClass CONSTANT = new InnerClass (5); ^ I: \ Documents \ NetBeansProjects \ TestingGround \ src \ testground \ TestClass.java: 22: Error: Invalid static declaration in inner class TestClass.InnerClass public static final TestClass CONSTANT = new InnerClass (5); ^ 'static' modifier is allowed only in declarations with variable variable 2 errors

#, .

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 ?

+4
2

( ), - . : # - # Java, static # static Java.

1

, , :

public static final TestClass CONSTANT = new SomeConcreteTestClass().new InnerClass(5);

( SomeConcreteTestClass - , TestClass)

, :

public static final TestClass CONSTANT = ((TestClass) null).new InnerClass(5);

, InnerClass, , , :

, , , (ยง4.12.4).

, :

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);
}

2

InnerClass static:

public static final class InnerClass extends TestClass

static . # ( generics -, ...) , ...

+7

Java , , , . JLS 8.1.3

+1

All Articles