web-dev-qa-db-ja.com

Javaの内部クラスとサブクラス

Java(またはその逆)のサブクラスよりも内部クラスを使用する方が有益な状況はありますか?私の現在の理解に基づいて、内部クラスはフィールドとメソッドにアクセスできますこれは、継承を使用する場合とどのように異なりますか?

サブクラスは通常、publicおよびprotectedというラベルの付いたすべてのフィールド/メソッドにアクセスできます。親クラスでprivateとラベル付けされたフィールドには、getterメソッドを使用してサブクラスでアクセスできます。これまで見てきたことに基づいて、メソッドがprivateとラベル付けされている場合、それらは通常、publicまたはprotectedのいずれかとラベル付けされているクラスの他のメソッドで呼び出されます。確かに、私は経験豊富なJavaプログラマーではありませんが、それが一般的な傾向のようです。

私の現在の理解に基づくと、どちらかを選択することには実際には何のメリットもないようです。継承よりも内部クラスを使用する理由と時期(またはその逆)について誰かが洞察を与えることができますか?

7
Joel J.

内部クラスとサブクラスの間には大きな違いがあります。

  • 内部クラスは同じファイルにありますが、サブクラスは別のファイル、おそらく別のパッケージにある可能性があります。
  • 内部クラスのインスタンスは、それを含むクラスのインスタンスなしでは取得できません。
  • 内部クラスには必要なメソッドがありますが、サブクラスには親クラスのメソッドがあります。もちろん、サブクラスは追加のメソッドを定義できますが、常に親のメソッドがあります。

状況について:

  • 内部クラスは、大きなクラスがその内部操作に関連する(通常は短い)クラスを必要とする場合、および他の誰もそれを必要としない場合に使用されます。 Nik Gが引用した良い例はLinkedListです。これは、動作するためにNodeクラスが必要であり、短く、他のクラスは必要ありません。したがって、Node is LinkedListの内部クラス。
  • サブクラスは、「is-a」依存関係を定義するときに使用されます。これを想像してみてください。さまざまな種類の車を作りたいと考えています。それらには共通のプロパティと機能があります。それらはall移動可能、all乗客がいるなどです。したがって、これらの共通のものを使用して抽象クラス「Car」を作成します。そして、さまざまなタイプの車ごとにサブクラスを作成します。
12
ElectronWill

継承を使用する場合は、2つのクラス間に「is-a」関係を定義します。つまり、ChildClassis aParentClassです。

一方、内部クラスは必ずしも外部クラスに直接関連しているわけではありません。内部クラスを持つ主な理由は、外部クラスが他のクラスに通知せずにその機能を利用するためです。

頭のてっぺんから思いつく最も良い例はLinkedListです。ある種のプライベートNodeクラスを使用して、各要素のコンテンツを格納します。もちろん、単一のNodeLinkedList...ではありませんが、LinkedListで構成されていない限りNodesは機能しません。 LinkedList以外のクラスがNodeクラスが存在することを知る理由もありません。

5
Mage Xy

サブクラスはその親クラスの変数とメソッドを継承しますが、内部クラスは継承しません。

そのため、子クラスに親のメンバーが必要な場合はサブクラスを使用し、その一部を実行するためだけに必要な場合は内部クラスを使用する必要があります。

たとえば、Listという名前のクラスでNodeという名前の内部クラスを使用して、Nodeをメンバーとして使用できるようにします。

たとえば、メルセデスはCarのメンバーを継承し、必要に応じてCarのメソッドをオーバーライドする必要があるため、Carという名前のクラスでMercedesという名前のサブクラスを使用します。

1
MrBlueSky

これは簡単です。しかし、内部クラスとサブクラスは同じではありません。

サブクラスは、継承ロジックがある場合に使用します。たとえば、RectangleはShapeなので、RectangleはShapeから継承できます。

内部クラスは、特定のクラスでのみ使用する必要があるクラスがある場合に使用されます。そうすれば、内部クラスを使用する必要があるクラスにいない限り、誰もクラスを使用しません。例:クラスAがあります。クラスaにはマップがあります。 Keyクラスは、複合キークラスを定義するために作成したクラスであり、A内でのみ使用されます。したがって、Keyは内部クラスにすることができます。このようにして、ファイル(クラス)を削減できるため、他の開発者が処理および理解する必要がありません。彼はAを使用しています

それが理にかなっていることを願っています

1
Aviad