未分類

継承

投稿日:

   

継承のしくみを知る

これまでは、「キャラクタ」の機能をまとめたクラスを使って、プログラムを作成してきました。この章では、さらに、新しいプログラムを作成していくことにしましょう。

5種類の格闘ゲーム

を扱うプログラムを作成することを考えてみてください。野獣キャラクタは初期キャラクタの一種ですから、多くの共通点があります。

javaでは、すでに作成したクラスをもとにして、新しいクラスを作成することができるようになっています。このように、新しいクラスを作成することを、

クラスを拡張する(extends)

といいます。

新しいクラス(野獣キャラクタ)は、概存のクラス(初期キャラクタ)のメンバを「受け継ぐ」しくみになっています。このため、初期キャラクタにあるメンバをコード中にもう一度書く必要はありません。野獣キャラクタ独自の機能だけを書けばよいのです。

このように、新しく拡張したクラスが概存のクラスのメンバを受け継ぐことを、継承と呼びます。この時、もとになる概存のクラスはスーパークラス、新しいクラスはサブクラスと呼ばれます。

クラスを拡張する

サブクラスの宣言をするには、extendsというキーワードに続けて、スーパークラスの名前を指定します。

BeastCharaクラスはCharacterクラスのメンバを継承します。このため、BeastCharaクラス内では、Characterクラスにない、独自のメンバだけ書けばよいのです。

これが、stageフィールドとsetStage()メソッドとなっています。

setChara()メソッド①はスーパークラスで定義されているメソッドです。また、サブクラスで新しく追加したsetStage()メソッド②も同じように呼び出すことができます。

このように、クラスを拡張することで、すでに設計したクラスから効率よく新しいクラスを作成することができます。

スーパークラスのコンストラクタを呼び出す

Sample11_01_1の実行結果をよく見てください。最初に「キャラクターが誕生しました。」と出力されていることから、スーパークラスのコンストラクタの処理が先に行われていることがわかります。

このように特に何も指定しない場合、

サブクラスのコンストラクタ内の先頭で、スーパークラスの引数のないコンストラクタを呼び出す

ということになっています。

スーパークラスのコンストラクタは、サブクラスに継承されません。そのかわり、スーパークラスの引数なしのコンストラクタが、自動的に呼び出されます。

スーパークラスのコンストラクタを指定する

スーパークラスにコンストラクタが複数ある場合には、呼び出されるコンストラクタを明示的に指定したい場合があります。

このとき、サブクラスのコンストラクタの先頭で、super()という呼び出しをすることができます。

サブクラスの引数4個のコンストラクタの先頭で、

super(n, a, b);

と記述しています。「引数のないコンストラクタ」ではなく、「引数2個のコンストラクタ」が最初に呼び出されています。つまり、super()を記述すると、スーパークラスのどのコンストラクタを呼び出すかを指定できるのです。

サブクラス内からアクセスする

privateやpublicを指定して、メンバへのアクセスをコントロールし誤りのおきにくいプログラムを作成してきました。

ここでは、サブクラスとスーパークラスという密接な関係にあるクラスについて、どのようにアクセスできるのかを学ぶことにしましょう。

privateメンバにはクラスの外からアクセスすることができません。スーパークラスのprivateメンバには、サブクラスからもアクセスすることができないようになっています。

しかし、サブクラスとスーパークラスは密接な関係にあるので、protectedという指定方法があります。下記のコードを見てください。protectedメンバに書き換えると、BeastCharaクラスからアクセス可能です。

スーパークラスでprotectedを指定することで、

サブクラスからアクセスすることができる

というしくみになっています。

-未分類

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

サンプルイメージ

練習問題(日付クラス)

         練習12-1 実行した日を含め30日を画面に表示してください。 練習12-2 CharacterオブジェクトをyyyyMMdd形式の文字列に変換するメソッド、formatYMDを作成 …

サンプルイメージ

練習問題(クラスの利用)(前半)

      練習10-1 MarkPrinterMain1~4クラスを実行すると下図の様な実行結果となるようにMarkPrinterクラスを作成してください。 練習10-2 MarkPrinterクラ …

サンプルイメージ

クラス変数、クラスメソッド

      これまでのコードは、クラス内のメンバ(フィールドとメソッド)は、オブジェクトが作成されたときに、はじめて値を格納したり呼び出したりすることができました。 オブジェクトを作成することによって …

サンプルイメージ

アリギリス プロフィール

       私はこれからjavaの基礎及び環境開発、JDKのインストールを解説し、より多くの人にスマホでゲームを作成してもらい「モノ作り」の面白さに触れてもらいたいと思います。 このブログではjav …

サンプルイメージ

日付クラス

        Dateクラスは日時を取得するときに使用します。「import java.util.Date」のインポート文が必要です。 次に日付のフォーマットを設定するには、SimpleDateFo …