Why can\'t we instantiate a class with a protected constructor if its child is in a different package? If protected variables and methods can be accessed, why doesn\'t the s
According to the Java Spec (https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2.2)
6.6.2.2. Qualified Access to a
protectedConstructorLet
Cbe the class in which aprotectedconstructor is declared and letSbe the innermost class in whose declaration the use of theprotectedconstructor occurs. Then:
If the access is by a superclass constructor invocation
super(...), or a qualified superclass constructor invocationE.super(...), whereEis 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 expressionE.new C(...){...}, whereEis 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 expressionE.new C(...), whereEis a Primary expression, or a method reference expressionC :: new, whereCis a ClassType, then the access is not permitted. Aprotectedconstructor 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.
In your case, access to the protected constructor of A from B would be legal from a constructor of B through an invocation of super(). However, access using new is not legal.