7

java.net.URLから継承したいのですが、最終的なものなのでできません。エラーが発生します:

cannot inherit from final java.net.URL

なぜそれが最終的なのですか?

文字列が最終状態である理由、JVMは非常に基本的なデータ型であるため文字列に依存しているという質問に対するいくつかの回答。これがURLタイプにどのように適用されるかわかりません。

アップデート

多くの回答とコメントが理由を示しており、継承を避けることが良い習慣である理由を示しています。すべてが最終的なものであるべきだと考える人さえいます。しかし、現実は別のものです。JDKのほとんどのクラスは最終的なものではありません。良い習慣であることは、 java.net.URLから継承すべきではない理由です。これは、JDKのどのクラスにも当てはまる可能性があります。しかし、何かが最終的なものとして定義されている場合、それを継承することはできません。これは、StringまたはURLなどのごく少数のクラスにのみ適用されます。

したがって、URLと他のすべての非最終クラスの間には何か違うものがなければなりません。問題は、この違いは何であり、それが必要になるのか、その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 に答える