Why can’t I use protected constructors outside the package? [duplicate]

Usually protected means only accessible to subclasses or classes in the same package. However here are the rules for constructors from the JLS:

6.6.2.2. Qualified Access to a protected Constructor

Let C be the class in which a protected constructor is declared and
let S be the innermost class in whose declaration the use of the
protected constructor occurs. Then:

If the access is by a superclass constructor invocation super(…),
or a qualified superclass constructor invocation E.super(…), where E
is a Primary expression, then the access is permitted.

If the access is by an anonymous class instance creation expression
new C(…){…}, or a qualified anonymous class instance creation
expression E.new C(…){…}, where E is a Primary expression, then
the access is permitted.

If the access is by a simple class instance creation expression new
C(…), or a qualified class instance creation expression E.new
C(…), where E is a Primary expression, or a method reference
expression C :: new, where C is a ClassType, then the access is not
permitted. A protected constructor can be accessed by a class instance
creation expression (that does not declare an anonymous class) or a
method reference expression only from within the package in which it
is defined.

As an example, this does not compile

public class Example extends Exception {

    void method() {
        Exception e = new Exception("Hello", null, false, false);
    }
}

but this does

public class Example extends Exception {

    Example() {
        super("Hello", null, false, false);
    }
}

and so does this

public class Example {

    void method() {
        Exception e = new Exception("Hello", null, false, false) {};
    }
}

So the rules are clear, but I can’t say I understand the reasons behind them!

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)