【问题标题】:Access to a protected constructor in Java在 Java 中访问受保护的构造函数
【发布时间】: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 方法中使用超类。

标签: java subclass protected


【解决方案1】:

似乎问题在于您的类位于不同的包中。 Java doc 说:

如果访问是通过简单的类实例创建表达式new C(...),或限定类实例创建表达式E.new C(...),其中E 是主表达式,或方法引用表达式C :: new,其中@987654326 @ 是 ClassType,则 不允许访问。受保护的构造函数可以通过类实例创建表达式(不声明匿名类)或方法引用表达式只能从定义它的包中访问

【讨论】:

    【解决方案2】:
    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
        }
    }
    

    尝试运行程序,您将在控制台上看到预期的结果。

    【讨论】:

    • 非常好的答案。
    • 啊……我了解情况。我将类名设置为相同.....然后它不起作用
    • 你明白了... :)
    猜你喜欢
    • 2011-05-02
    • 2014-08-29
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2013-08-01
    相关资源
    最近更新 更多