第 10 回: スーパークラスとサブクラス, extends, 継承, IS-A 関係, HAS-A 関係, オーバーライド, 継承とアクセス制御, 抽象クラス

スーパークラスとサブクラス

1. すてに存在するクラスに, 新しいメソッドやフィールドを追加したり, メソッドを上書きしたりして, 新しいクラスを作ることができる.
2. サブクラス: クラスを拡張して出来た新子クラスをもとのクラスのサブクラス (subclass) と呼ぶ.
3. スーパークラス: もとのクラスを, 拡張して出来たクラスのスーパークラス (superclass) と呼ぶ.

extends

長方形に名前を付けた新しいクラスを宣言する:

class NamedRectangle extends Rectangle{

}
1. Rectangle のサブクラスである NamedRectangle を宣言する
2. NamedRectangle のスーパークラスは, Rectangle です.
3. Rectangle は, NamedRectangle の拡張クラスです.
class ClassB extends ClassA{
  ...
}
_images/class.png

スーパークラス ClassA とサブラクス ClassB

Rectangle.java:

class Rectangle{
  int width;
  int height;

  Rectangle(){
    setSize(0, 0);
  }

  Rectangle(int width, int height){
    setSize(width, height);
  }

  void setSize(int width, int height){
    this.width = width;
    this.height = height;
  }

  public String toString(){
    return "[" + width + ", " + height + "]";
  }
}

NamedRectangle.java:

class NamedRectangle extends Rectangle{
  String name;
  NamedRectangle(){
    super();
    name = "NO NAME";
  }

  NamedRectangle(String name){
    super(200, 32);
    this.name = name;
  }
}

継承

1. サブクラスはスーパークラスのフィールドとメソッドを受け継ぐ.
2. コンストラクタは継承されない.
3. スーパークラスのコンストラクタの明示的な呼び出しには super() を使う.

IS-A 関係

1. サブクラスはスーパークラスの一種である. をオブジェクト指向の用語で [IS-A 関係] という.
2. 犬は哺乳類の一種である.
3. NamedRectanlge は, Rectanlge の一種である.

HAS-A 関係

インスタンスをフィールド型として持つとそのインスタンスを自分のものとして扱える. このような関係を [HAS-A 関係] という.

オーバーライド

サブクラスでスーパークラスから継承したメソッドやフィールドに同じ名前のメソッドやフィールドを宣言すると変更することができる. これをオーバーライドと呼ぶ.

継承とアクセス制御

1. スーパークラスで private と書かれたフィールドやメソッドは, サブクラスに継承されない.
2. 他のクラスから利用させたくないフィールドやメソッドに対して利用する.
3. そのクラス内部だけで使うため.
4. このように名前の使用を許可したり, 禁止したりする機構をアクセス制御と呼ぶ.

抽象クラス

1. メソッドの名前と引数の型だけが決まっていて, 実装がないメソッドを抽象メソッド (abstract メソッド) と呼び, そのクラスを抽象クラス (abstract クラス) と呼ぶ.
2. 抽象クラスはそのサブクラスを宣言して抽象メソッドをオーバーライドする必要がある.