【发布时间】:2019-02-21 01:30:48
【问题描述】:
那里给出的最佳答案指出可以使用super() 调用受保护的构造函数,但不能使用new 实例化?为什么这样?如果这是原因,那么包私有(无修饰符)和受保护的构造函数之间有什么区别?
以下代码对我没有任何影响。
package pack1;
public class Rr {
protected Rr() {
System.out.println("Rello");
}
}
package pack2;
class Tt extends pack1.Rr {
Tt() {
super(); //works
pack1.Rr r = new pack1.Rr(); //error
}
}
class Uu {
public static void main(String args[]) {
Tt t = new Tt();
}
}
【问题讨论】:
-
访问修饰符写在构造函数前面没有特殊含义。因此,它们的正常定义适用(参见here)。简而言之:
default和protected之间的区别在于protected授予子类的访问权限。 -
“为什么会这样?” => 最佳答案还引用了 Java 语言规范的相关部分。
-
@Turing85 这里的特殊情况是两个访问(
super()和new ...)都来自一个子类。这就是问题所在。 -
奇怪的是,我刚试了一下,只有当两个类在不同的包中时调用才无效。可以在您链接的重复问题中找到解释。
标签: java