【发布时间】:2018-07-16 02:13:07
【问题描述】:
如果我有一个 A 类及其子类 B。
package washington;
public class A{
protected A(){}
}
package washington;
public class B extends A{
public B(){super();} // it works
public static void main (String[] args){
A b = new A(); // it does work.
}
}
A类有一个受保护的构造函数,但我无法访问B中的构造函数。我认为这是一个规则,但是我找不到描述这种情况的网页。我看到提到的所有protected都可以访问来自子类、同包....等
package california;
public class A extends washington.A{
public static void main (String[] args){
new washington.A(); // it does not work.
}
}
不知道是不是因为我使用 IntelliJ IDEA 2017.3.4.. 编译器是 javac 9.0.4
【问题讨论】:
-
您不能将
A的实例分配给B。除此之外,它工作正常:ideone.com/VRha9m -
stackoverflow.com/questions/215497/… 这可能有助于消除任何混淆。
-
在子类引用中不能分配给超类对象
-
为什么不:
B b = new B();? (在任何包装中) -
对我来说很新:似乎受保护的方法通常不能从子类访问,而只能通过 super 关键字访问。 IE。您可以通过
super()和protected method a()通过super.a()访问构造函数,但不能直接访问(new california.A()或new california.A().a())。因此,如果这是一个问题,您应该解释为什么不能公开构造函数以及为什么必须在 main 方法中使用超类。