「Java言語」の「抽象クラス」の仕組み
「抽象クラス」の仕組みについて学んでいきたいと思います。
なぜこのような機能があるのか、今だに理解できていない「謎」な部分が多い機能ですが、ゆっくりと理解を進めていきたいと思います。
この当たりから理解が追い付かなそうな予感がしてきました(^^;)
抽象クラス
「抽象クラス」の作り方は、
public abstract class クラス名 { abstract 戻り値のデータ型 メソッド名(); }
のようになります。
メソッドの先頭に「abstract」が付いていますが、このメソッドは「抽象メソッド」というメソッドです。
この「抽象メソッド」は、「処理の内容を書かない」という特徴があります。
そして、「class」キーワードの前に「abstract」が付いているクラスが「抽象クラス」です。
「抽象クラス」と「抽象メソッド」を作ってみると、
public abstract class GameMachine { abstract void playGame(); }
のようになります。
プログラムを作ってみる
「ゲーム好き」なので、「ゲーム機」の「抽象クラス」を作ってみました。
「抽象クラス」は、インスタンスを作れないクラスなので、
GameMachine gm = new GameMachine();
のようにインスタンスを作ることができません。
もし、間違って「抽象クラス」のインスタンスを作ろうとすると、
型 GameMachine のインスタンスを生成できません
のようなエラーが発生します。
「抽象クラス」は、継承した「継承先のクラス」でインスタンスを作ることができます。
今回は「新しいゲームマシン」のクラスを作ってみたいと思います。
public class NewGameMachineA extends GameMachine{ //「GameMachineクラス」の「抽象メソッド」の内容を実装 public void playGame() { System.out.println("4Kで●●のゲームを遊びます。"); } }
のように「GameMachine」のクラスを作ります。
ここでのポイントは「抽象クラス」で定義されていた「抽象メソッド」の内容をしている部分です。
「GameMachine」クラスには、「抽象メソッド」として「playGame」メソッドを定義していましたので、このメソッドの内容を実装しています。
もし、「抽象メソッド」の実装を忘れると「NewGameMachineA」クラスも「抽象クラス」扱いになってしまい、インスタンスが作れません。
このあたりの仕組みが複雑でなかなか覚えるのが大変・・・
プログラムを実行する「main」メソッドを
public class Main { public static void main(String[] args) { NewGameMachineA ngmA = new NewGameMachineA(); ngmA.playGame(); } }
のように作って実行すると、
4Kで●●のゲームを遊びます。
のように表示されます。
実際にどのような時にこの仕組みが使われるのかがなかなか掴めないですね。
そもそもなんのために「抽象クラス」があるのかを、今後も学んでいきたいと思います。