scope of private constructor in Nested Class

Anshu picture Anshu · Sep 22, 2012 · Viewed 9.4k times · Source

This is more of a puzzle than question. I have the following code:

public class PrivateBaseConstructor {
    public static class BaseClass {
        private BaseClass() {
        }

    }

    public static class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }
}

Here the call for super(); at 1* is allowed even though the base class constructor is private. If we write the classes as separate classes in same package:

BClass.java
public class BClass {
    private BClass() {

    }
}

DClass.java
public class DClass extends BClass {
    public DClass() {
        super(); // 2*
    }

The compiler rightly gives an error at 2* since the base class constructor is not visible.

Why doesn't the compiler throw an error in my first scenario when both the classes are declared static within one class?

Answer

irreputable picture irreputable · Sep 22, 2012

if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1