Anshu
Anshu

Reputation: 7853

scope of private constructor in Nested Class

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?

Upvotes: 34

Views: 12232

Answers (3)

irreputable
irreputable

Reputation: 45443

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

Upvotes: 38

KappaMax
KappaMax

Reputation: 324

Because nested classes can see each others members. This has nothing to do with the static declarations. See the following example of your code with just nested inner classes (not static).

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

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

    public static void main(String[] args)
    {
       new PrivateBaseConstructor(). new DerivedClass();
    }
}

Read more about nested classes here: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Upvotes: 4

Frank Pavageau
Frank Pavageau

Reputation: 11715

Because anything declared inside a class can access its private members, including inner classes. However, if you run PMD on your class, you'll find it suggests you change the visibility of the constructor to not-private.

Upvotes: 1

Related Questions