如果子类位于不同的包中,为什么我们不能使用受保护的构造函数实例化一个类?如果可以访问受保护的变量和方法,为什么相同的规则不适用于受保护的构造函数?
pack1:
package pack1;
public class A {
private int a;
protected int b;
public int c;
protected A() {
a = 10;
b = 20;
c = 30;
}
}
pack2:
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 https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2.2)
6.6.2.2。合格的访问protected
构造函数
Let C
是一个类,其中protected
声明构造函数并让S
是其声明中使用的最内部类protected
构造函数发生。然后:
-
如果访问是通过超类构造函数调用进行的super(...)
,或合格的超类构造函数调用E.super(...)
, where E
is a Primary表达式,则允许访问。
-
如果访问是通过匿名类实例创建表达式进行的new C(...){...}
,或合格的匿名类实例创建表达式E.new C(...){...}
, where E
is a Primary表达式,则允许访问。
-
如果访问是通过简单的类实例创建表达式进行的new C(...)
,或合格的类实例创建表达式E.new C(...)
, where E
is a Primary表达式,或方法引用表达式C :: new
, where C
is a 类类型,则不允许访问。 A protected
构造函数只能通过类实例创建表达式(不声明匿名类)或仅从定义它的包中的方法引用表达式来访问。
在您的情况下,访问受保护的构造函数A
from B
从构造函数来看是合法的B
通过调用super()
。但是,使用访问new
不合法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)