前回の例では、継承したスーパークラスを何気に使っていましたが、スーパークラス側で初期化(コンストラクタ)が必要な設計になっている場合、どのように実装したらいいのかが気になります。
javaの言語仕様としては、コンストラクタの呼び出しは自動的に呼ばれる仕様になっているようです。
このときに呼ばれるのは「引数なし」コンストラクタとなるようです。
この自動的に呼び込まれるコンストラクタを自分の明示により呼び出す仕組みが「super()」という呼び出し方です。
以下に例を書きます。
public class SuperClassTest3{ public static void main(String[] args) { //オブジェクトのインスンタンスを生成する TestClassChild tcc = new TestClassChild(); System.out.println(tcc.TestA); System.out.println(tcc.TestB); //tcc.PrintTextC(); //tcc.PrintTextP(); } } class TestClassChild extends TestClassParent { TestClassChild() { //引数なしコンストラクタ用 //スーパークラスの引数なしコンストラクタを呼ぶ super(); } TestClassChild(int TestAA, int TestBB) { //スーパークラスの引数つきコンストラクタを呼ぶ super(TestAA, TestBB); } void PrintTextC() { System.out.print("PrintTextC !! \n"); } void PrintTextP() { System.out.print("PrintTextP オーバーライドテスト !! \n"); } } class TestClassParent { int TestA = 10; int TestB = 20; TestClassParent(int a, int b) { //やっていることは「setTest」メソッドを同じ TestA = a; TestB = b; System.out.print("引数つきコンストラクタ !! \n"); } TestClassParent() { //引数なしコンストラクタ用 System.out.print("コンストラクタ !! \n"); } void PrintTextP() { System.out.print("PrintTextP !! \n"); } }
実行した結果は以下のようになります。
コンストラクタ !! 10 20
結果として「コンストラクタ !! 」と表示されているのは
TestClassChild tcc = new TestClassChild();
でTestClassChildのインスタンスが生成された際に、子クラス(TestClassChild)の引数なしコンストラクタ「TestClassChild()」が反応し
「super();」が呼ばれた結果
親クラスの引数なしコンストラクタ(TestClassParent())が呼ばれて
「System.out.print(“コンストラクタ !! \n”);」が実行されたから
になります。
少しややこしいけど、書きなれて体得していくしかないかと思います。