7

我想从java.net.URL继承,但我不能,因为它是最终的。我得到错误:

cannot inherit from final java.net.URL

为什么是最终的?

为什么String 是最终状态的问题的一些答案,JVM 依赖 String 因为它是一种非常基本的数据类型。我看不出这将如何应用于 URL 类型。

更新

许多答案和评论都给出了理由,为什么避免继承是一种好习惯。有些人甚至认为一切都应该是最终的。但实际情况有所不同。JDK 中的大多数类都不是最终类。良好的实践是不应从 java.net.URL 继承的一个原因。这甚至可能适用于 JDK 的任何类。但是当某些东西被定义为 final 时,不能继承了。这仅适用于一些极少数的类,如 String 或 URL。

所以 URL 和所有其他非 final 类之间一定有一些不同。问题是:这个 URL 是最终的,有什么区别?

说我不应该关心这个问题,因为无论如何我都不应该继承,这不是问题的答案。

4

3 回答 3

7

它是最终的,特别是为了防止你扩展它。然而它在内部工作,它不是为继承而设计的,所以作者阻止你这样做。

记住有效的 Java:

  • 第 17 项: “设计和文件继承,否则禁止。”
  • 第 16 条: “优先组合而不是继承。”

因此,不要扩展URL,而是创建一个具有URL字段的类。

于 2012-09-12T15:53:47.260 回答
2

我的猜测是这是出于安全原因。如果一个方法需要 URL 对象作为参数,并且您可以扩展 URL 类以执行 URL 类不应该执行的操作,那么它可能存在安全问题。

于 2012-09-12T15:55:47.683 回答
0

AFAIK URL 是 IETF RFC 标准的完整实现,因此预计您不会想要更改或扩展它。

于 2012-09-12T15:56:27.070 回答