0
0

More than 3 years have passed since last update.

初心者から始めるJava、継承

Last updated at Posted at 2020-03-16

追記2020/3/16
クラス名のつけ方で間違いがあったことを、コメントで指摘いただいたので訂正。

はじめに

この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

環境

言語:Java11、JDK13.0.2
動作環境:Windows10

クラスの拡張

今まで書いてきたクラスはどれも独立して書かれたものだったが、毎回メンバ(フィールドとメソッド)を設定する必要があった。Catクラス程度ならば頑張れば作れるだろうが、膨大なメンバ(フィールドとメソッド)を持つクラスを毎回すべて書くのは現実的ではない。
Javaは、既存のクラスが持っているメンバをそのまま引き継ぎつつ、独自のクラスを作るためのクラスの拡張(extend)機能がある。

extendedHousecat
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……色々呼び方はある)クラスを作った。このとき、WildcatHouseCatは親と子の関係になり、それぞれsuper classsub 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仕様

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0