追記2020/3/16
クラス名のつけ方で間違いがあったことを、コメントで指摘いただいたので訂正。
はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
環境
言語:Java11、JDK13.0.2
動作環境:Windows10
クラスの拡張
今まで書いてきたクラスはどれも独立して書かれたものだったが、毎回メンバ(フィールドとメソッド)を設定する必要があった。Cat
クラス程度ならば頑張れば作れるだろうが、膨大なメンバ(フィールドとメソッド)を持つクラスを毎回すべて書くのは現実的ではない。
Javaは、既存のクラスが持っているメンバをそのまま引き継ぎつつ、独自のクラスを作るための**クラスの拡張(extend)**機能がある。
class WildCat
{
protected double weight;
protected double height;
protected String name;
public static int sumCats = 0;
public wildCat()
{
weight = 0.0;
height = 0.0;
sumCats++;
System.out.println("ニャーゴ、猫をまた一匹見つけたよ。");
}
public WildCat(double we,double he)
{
weight = we;
height = he;
sumCats++;
System.out.println("ニャーゴ、猫をまた一匹見つけたよ。");
System.out.println("見つけた猫は、体重" + weight + "kg、身長" + height + "cmみたい。");
}
public void measureWeightHeight(double w,double h)
{
weight = w;
height = h;
System.out.println("この猫を計測してみました。");
System.out.println("体重は" + weight + "kg、身長は" + height + "cmあります。");
}
public static void countCats()
{
System.out.println("全部で" + sumCats + "匹の猫を見つけたよ。");
}
}
//ヤマネコ(Wildcat)のクラスをベースに、イエネコ(Housecat)のクラスを作ろう。
class HouseCat extends WildCat
{
private String collorColor;
private String nickname;
public void callNickname(String s)
{
nickname = s;
System.out.printlm("この猫に、新しく" + nickname + "ってニックネームを付けたよ。");
}
}
ヤマネコ(WildCat
)クラスを拡張して、イエネコ(HouseCat,Cat
……色々呼び方はある)クラスを作った。このとき、Wildcat
とHouseCat
は親と子の関係になり、それぞれsuper class
とsub class
になる。
スーパーなのかサブなのか
WildCat
クラスを拡張したHouseCat
クラスには、親であるWildCat
クラスが持っていたメンバ(フィールドとメソッド)が引き継がれているので、
HouseCat cat1 = new HouseCat();
cat1.measureWeightHeight(5.0,50.5);
とすることで、体重5.0kgで身長50.5cmのHouseCat
オブジェクトを生成できる。
もちろん、collorColor(首輪の色)とnickname(あだ名)フィールドも持っているし、
public void callNickname()
メソッドであだ名をつけることもできる。
あえて親のコンストラクタを使いたい
HouseCat
クラスにはコンストラクタがないが、sub class
でコンストラクタを用意しなかった場合、super class
のコンストラクタのうち引数のないコンストラクタが、HouseCat
オブジェクトを生成したときに自動的に呼び出される。今回はpublic WildCat()
の方だ。
だが例えば、super(8.0,60.8)
としてコンストラクタ内で呼び出してやれば、8.0kg、60.8cmのイエネコとして呼び出されることになる。
privateより内向的で、privateより社交的
WildCat
クラスのフィールドがいつもと違うのに気が付いただろうか?(実はここまで書き進めてから直した)。protected
は、「同じクラスか、子であるサブクラスからであればアクセスできる」という意味の修飾子になる。
サブクラスをどんどん作って発展させたいスーパークラスになると予想できるときは、protected
にしておくと後から扱いやすいだろう。
アクセス制限としてはパッケージも控えているが、ここでは割愛。
終わりに
継承後のサブクラスが持っていなければならないもの、スーパークラスのメンバがどこからまでのアクセスを認めているのか。こういった問題にまだ悩まされているので、ここの理解はまだまだ甘いのが現状。
以前扱ったJava11のリファレンスも、少し覗いただけでextends
がわちゃわちゃと出てきている。この家系図を理解したとき、本当のJavaが見えてくるのだろう、多分。
参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。
やさしいJava 第7版
Java SE11 Silver 問題集(通称黒本)
Java® Platform, Standard Edition & Java Development Kit
バージョン11 API仕様