如果子类在不同的包中,为什么我们不能用 protected 构造函数实例化一个类?如果可以访问 protected 变量和方法,为什么同样的规则不适用于 protected 构造函数?
包装1:
package pack1;
public class A {
private int a;
protected int b;
public int c;
protected A() {
a = 10;
b = 20;
c = 30;
}
}
包装2:
package pack2;
import pack1.A;
class B extends A {
public void test() {
A obj = new A(); // gives compilation error; why?
//System.out.println("print private not possible :" + a);
System.out.println("print protected possible :" + b);
System.out.println("print public possible :" + c);
}
}
class C {
public static void main(String args[]) {
A a = new A(); // gives compilation error; why?
B b = new B();
b.test();
}
}
最佳答案
根据 Java 规范 (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
protected
ConstructorLet
C
be the class in which aprotected
constructor is declared and letS
be the innermost class in whose declaration the use of theprotected
constructor occurs. Then:
If the access is by a superclass constructor invocation
super(...)
, or a qualified superclass constructor invocationE.super(...)
, whereE
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 expressionE.new C(...){...}
, whereE
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 expressionE.new C(...)
, whereE
is a Primary expression, or a method reference expressionC :: new
, whereC
is a ClassType, then the access is not permitted. Aprotected
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.
在您的情况下,访问 A
的 protected 构造函数来自 B
对于 B
的构造函数是合法的通过调用 super()
.但是,使用 new
访问不合法。
关于java - protected 构造函数和可访问性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150748/