#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
##環境
言語:Java11、JDK13.0.2
動作環境:Windows10
#オブジェクトを作れないクラス
今まで扱ったクラスはすべて、オブジェクト生成をしたあとのことを考えて内容を作っていた。だが、この抽象クラスそのものではオブジェクト生成・インスタンス化ができない。
今回の抽象クラスは、「クラスを作ることを考えて内容を決める」必要があるクラスであり、「この抽象クラスを継承したクラスを作るとき、この機能だけはつけてくださいね」というつもりで内容を考えるとよい。
抽象クラスと、そのメソッドのうち処理内容を定義していないメソッドについて。抽象クラスは、**abstract
修飾子を持ち処理内容をその場では定義しないメソッド(抽象メソッド)**を持つという特徴があり、class
の前にabstract
を付けることで抽象クラスとして宣言できる。
abstract class Wild
{
protected int number;
public void getNumber(int n)
{
number = n;
System.out.println("この猫は" + number + "番目の猫です。");
}
abstract void show();
}
注意点として。抽象クラス内には抽象メソッドが必要だが、具象メソッド(abstract
を付けていないメソッド)を実装してもよく、具象メソッドはサブクラスではそのまま継承されたメソッドとして利用できる。
##抽象メソッドは必須事項を定める
抽象クラスを継承したサブクラスは、abstract
のついた抽象メソッドを元に具象メソッドをオーバーライドで実装しなければならない。
オーバーライドするということは、
1.シグニチャ(メソッド名。この場合引数関係は実装を待つ、と考えている)が同じ
2.アクセス修飾子が同じかより緩い
3.戻り値の型が原則同じ(共変戻り値を除く)
この条件を満たす必要があるということ。
同じ名前のメソッドがサブクラスに必須となるので、抽象クラスの内容をよく理解しないといつまでもエラーを吐き続けることになる。
class HouseCat extends Wild
{
public void see(int num)
{
number = num;
System.out.println("この猫は" + number + "番目の猫です。");
}
//ちょっと待った、show()はどこだ?
}
#おわりに
instanceof
演算子を使うと、2項の変数が同じクラスに属しているかどうか調べることが出来る。
Java SE11 Silver 問題集(通称黒本)から引用。
a instanceof b
aが、bと同じクラスかbのサブクラスのインスタンスであればtrue
main
関数内で条件分岐に組み込むことが出来るので、チェック機構に向いている。
今回扱った抽象クラスによく似たものとして、次回予定のインターフェースがあるのだが、これらの違いをよく確認しておきたい。
#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。