在Java中访问受保护的构造函数

在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.

如果我有一个类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
都可以从同一个包的子类中访问。。。。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
    }
}