質問: new SubClass(2,3); System.out.println(sub.num + ":" + sub.a + ":" + sub.b ); } } ```
回答: > > オーバーロードしたコンストラクタが2つありますが後者の方に代入されるという認識をしています。 > > > `new SubClass(2,3);`と呼んでいるので、`public SubClass(int a, int b)`が呼ばれます。 代入されるというより、コンストラクタが呼び出されると考えた方が良いです。 > > this(a);がちょっと気になりますが。 > > > `this`は自身のインスタンスを指します。`this()`とした場合は、コンストラクタが呼び出されます。 ここで呼び出されるコンストラクタは、引数のパターンが一致する、 `public SubClass(int a)`になります。 > > そして最大の謎がmainクラスでsub.numを呼び出している点です。 > > > `sub`は、`SubClass sub = new SubClass(2,3);`としているとおり、`SubClass`クラスのインスタンスです。 `SubClass`クラスは、`class SubClass extends SuperClass`の通り、`SuperClass`クラスを継承しています。 `SuperClass`クラスは、`protected int num;`と、継承先からもアクセス可能な`num`フィールドを持ちます。 なので、それを継承したクラスのインスタンスである、`sub`は、自身の内に`num`フィールドを持ち、それにアクセス可能です。 サブクラスのコンストラクタが呼ばれた時に、特に指定が無い場合は、スーパークラスのコンストラクタが引数無しで自動的に呼ばれます。