在Java中访问受保护的构造函数
如果我有一个类a和它的子类B在Java中访问受保护的构造函数,java,subclass,protected,Java,Subclass,Protected,如果我有一个类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.
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
都可以从同一个包的子类中访问。。。。e、 t.c
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问题似乎在于您的类位于不同的包中。说: 如果访问是通过简单类实例创建表达式
new C(…)
,或限定类实例创建表达式E.new C(…)
,其中E
是主表达式,或方法引用表达式C::new
,其中C
是类类型,则不允许访问。受保护的构造函数只能由类实例创建表达式(不声明匿名类)或方法引用表达式从定义它的包中访问
尝试运行该程序,您将看到控制台上打印的预期结果。您无法将
A
的实例分配给B
。除此之外,它还可以正常工作:这可能有助于消除任何混淆。在子类引用中,您不能分配给超类对象为什么不:B=new B()代码>?(在任何包中)对我来说都是新的:似乎受保护的方法不能从子类进行一般访问,而只能通过super关键字进行访问。也就是说,您可以通过super()
和protected method a()
通过super.a()
访问构造函数,但不能直接访问(new california.a()
或new california.a()
)。因此,如果这是一个问题,你应该解释为什么你不能公开构造函数,为什么你必须在你的主方法中使用超类。回答得很好。啊。。。。。我了解情况。我将类名设置为相同。。。。。那就不行了,你明白了…:)
class A{
protected A() {
System.out.println("hello from A");
}
}
class B extends A{
public B() {
super();
System.out.println("hello from B");
}
public static void main (String[] args){
A b1 = new B(); // you can either do this
B b2 = new B(); // or this
}
}