【问题标题】:Abstract class constructor access modifier抽象类构造函数访问修饰符
【发布时间】:2010-09-20 14:50:02
【问题描述】:

一个抽象类只能作为基类被其他类扩展,对吧?抽象类的构造函数可以具有通常的访问修饰符(public、protected 和 private(供内部使用))。 protectedpublic 中的哪一个是要使用的正确访问修饰符,因为抽象类型似乎表明从技术上讲公共构造函数会受到非常多的保护?我应该只在所有构造函数上使用 protected 吗?

【问题讨论】:

  • 您忘记了包私有。它可以确保仅在该包中创建子类。
  • 请注意,受保护的构造函数也可以用于临时实例化。
  • “临时实例化”?

标签: java


【解决方案1】:

至少,抽象类应该有一个受保护的构造函数。这不是绝对必要的,因为无论如何都不可能使用构造函数,但它使合同明确。

另一种选择是将构造函数设为私有。如果类的所有实现都是私有内部类,这只是一个好主意。一个罕见但有用的例子。

【讨论】:

    【解决方案2】:

    因为抽象类型似乎表明从技术上讲,公共构造函数将受到非常多的保护

    嗯...对于抽象类,此构造函数范围 [public 或 protected] 没有太大区别,因为不允许实例化 [即使是 public]。由于它是由子类调用的,因此它可以无缝调用公共或受保护的构造函数。

    它完全取决于选择使用什么。在大多数情况下,我通常更喜欢公开。

    【讨论】:

      【解决方案3】:

      因为抽象类型似乎表明从技术上讲,公共构造函数将受到非常多的保护

      这是不正确的。抽象类不能通过调用其构造函数直接实例化,但是,任何具体实现都会继承抽象类的方法和可见性

      所以抽象类当然可以有公共构造函数。

      实际上,抽象类的构造函数只能从实现的构造函数中调用,所以它是public还是protected没有区别。例如:

      public class Scratch
      {
          public static abstract class A
          {
              public A( int i ) {}
          }
      
          public static class B extends A
          {
              private B() { super(0); };
          }
      }
      

      【讨论】:

      • 我相信修饰符被切换了——这种结构 B 不能从 Scratch 外部调用并且不支持该论点。然而,交换它们确实有效,尽管 Intellij 的批评者抱怨访问私人成员。
      • 我的想法是表明 A 的构造函数与其子类之外的所有代码无关。这可能不是最好的例子 :) 重要的是抽象类的构造函数可以是受保护的或公共的,但它总是从子类调用,所以没有真正的区别。
      • 引用来自哪里,已删除的答案?
      【解决方案4】:

      如果这种行为是真实的,我不确定它是否是真实的,您应该始终使用最受限制的范围来让您的应用程序运行。所以在这种情况下,我建议使用受保护的。

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 1970-01-01
        • 2012-11-12
        • 2013-09-18
        • 2014-01-27
        • 2014-04-01
        • 2017-01-12
        • 1970-01-01
        相关资源
        最近更新 更多