質問: ``` public class SuperClass { private int num =10; void test() { System.out.println(this.num); } } ``` ``` public class SubClass extends SuperClass{ private int num=20; public static void main(String[] args) { SubClass subclass=new SubClass(); subclass.test(); } } ``` ▪️質問内容 SuperClassを継承したSubClassを作成しました。 出力結果は「10」でした。 SubClassは、privateなフィールドやメソッドは継承できないのに、なぜSuperClassのフィールドが出力されるのですか? ご多用の中、大変恐縮でございますが、ご教示のほどよろしくお願い致します。
回答: 継承しても、privateの変数、関数は継承されません。 その為、SuperClassのnumとSubClassのnumは、無関係な別の変数です。 また、test()は、何も書いていないので、パッケージプライベートになります。 これは、継承されますが、コードの処理は、継承前のクラスの中で行われます。 その為、test()内のthisは、SubClassの内部にあるSuperClass領域を示すので、numの値は、10です。 SubClass側で設定した値を出力したい場合は、SuperClassでprotected int num = 10;とし、SubClass側で宣言を削除し、コンストラクタでnumの値を設定し直すのが定石でしょうか。 まずは、privateは、継承先も含め、外からは見えなくなっていると覚えてください。