サブクラスはプライベートフィールドを継承しますか? 質問する

サブクラスはプライベートフィールドを継承しますか? 質問する

これは面接の質問です。

サブクラスはプライベートフィールドを継承しますか?

私は「いいえ」と答えました。なぜなら、「通常の OOP の方法」ではそれらにアクセスできないからです。しかし、面接官は、間接的に、またはリフレクションを使用してそれらのフィールドにアクセスでき、それらがオブジェクト内にまだ存在しているため、それらは継承されていると考えています。

帰国後、私は次のような引用文を見つけました。javadoc:

スーパークラスのプライベートメンバー

サブクラスは親クラスのプライベート メンバーを継承しません。

面接官の意見に対する議論を何か知っていますか?

ベストアンサー1

ここでの質問/回答における混乱のほとんどは、継承の定義に関するものです。

明らかに、@DigitalRoss が説明しているように、サブクラスのOBJECTにはスーパークラスのプライベート フィールドが含まれている必要があります。彼が述べているように、プライベート メンバーにアクセスできないということは、そのメンバーが存在しないということではありません。

しかし、これはクラスの継承の概念とは異なります。Javaの世界では、意味論上の問題がある場合、仲裁者はJava言語仕様(現在第3版)。

JLSは次のように述べている(https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):

private と宣言されたクラスのメンバーは、そのクラスのサブクラスによって継承されません。protected または public と宣言されたクラスのメンバーのみが、クラスが宣言されているパッケージ以外のパッケージで宣言されたサブクラスによって継承されます。

これは、インタビュアーが提起した「サブクラスはプライベート フィールドを継承しますか」という質問に正確に答えています (強調は私によるものです)

答えは「いいえ」です。サブクラスのオブジェクトには、スーパークラスのプライベート フィールドが含まれます。サブクラス自体には、スーパークラスのプライベート フィールドの概念はありません。

それは衒学的性質のセマンティクスでしょうか? はい。それは面接で役に立つ質問でしょうか? おそらくそうではないでしょう。しかし、JLS は Java の世界の定義を確立しており、(この場合) 明確に定義しています。

編集済み (Java と C++ の違いにより、混乱を招くだけと思われる Bjarne Stroustrup からの引用を削除しました。私の回答は JLS に任せます :)

おすすめ記事