【问题标题】:Why does Java disallow subclasses which cannot access any constructors of its super class?为什么 Java 不允许无法访问其超类的任何构造函数的子类?
【发布时间】:2015-07-05 23:57:21
【问题描述】:

这个问题主要是参考 Luiggi 对这个 SO question 的回答: Why can you not inherit from a class whose constructor is private?

我了解 Java 强制每个子类构造函数都必须调用其超类的构造函数之一。如果所有超类的构造函数都是私有的,这显然是不可能的。因此,如果理论上子类可以从具有私有构造函数的超类继承,结果将是您无法在子类上调用构造函数。

但是如果我从不打算创建子类的实例呢?例如,如果我的子类只添加静态字段和方法,而我只对使用超类的静态字段和方法感兴趣怎么办?那我就不需要子类的构造函数了。

【问题讨论】:

  • 那么您是在问为什么 Java 设计者决定禁止这种子类?或者您是否要求我们向您展示 JLS 中编译器需要这种行为的位置?还是???
  • 我问的是第一个。
  • 那么在 OOP 术语中它并不是真正的“类”。它应该是“命名空间”之类的。不幸的是,在 Java 中我们必须使用类来完成它(或者在 java8 中也使用接口);这是一个黑客。

标签: java inheritance constructor


【解决方案1】:

如果我的子类只添加静态字段和方法,而我只是 有兴趣使用超类的静态字段和方法

在这种情况下,您不需要继承 - 使用 composition

【讨论】:

    【解决方案2】:

    你应该将你的班级声明为final。那么就保证不能再做子类了

    【讨论】:

    • 虽然你写的是真的 - 它回答的问题与被问到的问题完全不同......
    • @alfasin “但是如果我从不打算构建一个子类呢?”我以为他是在说他不想延长他的课。
    • @Michael 这不是他所说的(他不希望他的类被扩展)——事实上,他想要继承的类可能是由其他人编写的——这不是讨论。他问为什么他不能扩展一个所有构造函数都声明为私有的类,即使他不打算从子类实例化对象。所以问题是关于阻止他继承这样一个类的 Java 架构。
    【解决方案3】:

    如果只添加子类并且只能创建父类,那么子“类”实际上只是一个辅助类,没有添加任何功能/职责/等。给父母。在很多方面,它是没有意义的。

    【讨论】:

      【解决方案4】:

      这种子类不是合法的子类。即使它的所有字段和方法都被声明为静态的,它也会继承其所有超类的所有字段和方法,一直追溯到 Object。 Object 中有非静态方法。所以这个子类在它的声明中会有一些非静态方法(可能还有字段)。

      然后这个子类可以用作字段、变量、类型参数或方法参数的类型(即任何可以使用类型的地方)。编译器必须跟踪这个特定类型只能在某种受限意义上使用的事实。 (例如,想象一个返回该子类值的方法)。

      我敢肯定,这类事情还有很多陷阱。

      因此,归根结底,编写编译器会非常困难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-10
        • 2015-07-14
        • 1970-01-01
        • 2015-09-11
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多