第14回 新しいクラス(2)

  
参考書 Lesson 11.2(参考書p.351)〜Lesson 11.4
    
14 新しいクラス(つづき)
 
 11.2 メンバへのアクセス
 
・サブクラス内からアクセスする
 - メンバに privateprotectedpublic をつけて、アクセス制限を設定する 
 - スーパークラスの private メンバには、サブクラスからアクセスできない

 - アクセスの可否
アクセス修飾子
同じクラス
サブクラス
すべて
public

protected
×
指定なし
×( ×
private
× ×
  ()同じパッケージ内であれば 〇

 - スーパークラスの protected メンバには、サブクラスからアクセスできる
 
privateprotected の違い>
class Car // 車クラス(スーパークラス)
{
  private int num;
 
protected double gas;
      :
}
class RacingCar extends Car // レーシングカークラス(サブクラス)
{
      :
  public void show(){
    System.out.println("ナンバーは " + num); <--(×) エラー
    System.out.println("ガソリン量は " + gas); <--(〇) OK
      :
  }
      :
}
   
    
 11.3 オーバーライド
 
・メソッドをオーバーライドする
  - クラスを継承するとき、スーパークラスにあるメソッドと同じ名前(引数も同じ)のメソッドを定義できる
  これを オーバーライド と呼ぶ
  
<スーパークラスとサブクラスに同じ名前&同じ引数の show() メソッドがある場合>
class Car // 車クラス(スーパークラス)
{
      :
  public void show(){
    System.out.println("ナンバーは " + num );
    System.out.println("ガソリン量は " + gas );
  }
      :
}
class RacingCar extends Car // レーシングカークラス(サブクラス)
{
      :
  public void show(){
    System.out.println("コース番号は " + course );
  }

  public void setCourse(int c){
      :
  }
}
 
 - サブクラスで新しく定義した方の show() メソッドが実行される
 
・スーバークラスの変数でオブジェクトを扱う
 - スーパークラスの型のオブジェクト変数に、サブクラスのオブジェクトを代入できる
 - スーパークラス Car 、サブクラス RacingCar のとき、普通は
    RacingCar rc = new RacingCar();
  で利用するが、
    Car c = new RacingCar();
  のようにすることができる
 - この場合、オーバーライドされているメソッドが呼び出される
    Car c = new RacingCar();
    c.show();
  では、サブクラス RacingCarshow() が実行される
 - オーバーライドしていない c.setCourse(・・) は実行できない
  
・オーバーライドの重要性を知る
 - 同じメソッド名を経由してクラス固有の処理をする
 - オブジェクトをまとめて扱う、プログラムの可読性が高くなるなどのメリットがある

<上記プログラムのつづき>
      :
class Sample1
{
  public static void main(){
    Car [] c = new Car[4]; // スーパークラスのオブジェクト変数の配列
    c[0] = new Car(); // スーパークラスのオブジェクト
    c[1] = new Car(); // スーパークラスのオブジェクト
    c[2] = new RacingCar(); // サブクラスのオブジェクト
    c[3] = new RacingCar(); // サブクラスのオブジェクト

    for(int i=0;i<4;i++) c[i].show(); // 全て同じメソッド名で呼び出せる
  }
}

 

・スーパークラスと同じ名前のメンバを使う
 - サブクラスからスーパークラスのメンバ(メソッド、変数)を呼び出すことができる
 - サブクラス内で super. を記述すると、スーパークラスのメンバを指し示すことになる
  
super. でスーパークラスのメンバにアクセスする>
class Car // 車クラス(スーパークラス)
{
  int x;
      :
  public void show(){
    System.out.println("ナンバーは " + num );
    System.out.println("ガソリン量は " + gas );
  }
      :
}
class RacingCar extends Car // レーシングカークラス(サブクラス)
{
  int x;
      :
  public void show(){
    super.show(); // スーパークラス(Carクラス)の show()が呼ばれる
    System.out.println("コース番号は " + curse );
   
    x = 10; // サブクラスのメンバ変数
    super.x = 20; // スーパークラスのメンバ変数
  }
      :
}
 
 
final をつける
 - finalメソッドの先頭につけると オーバーライドができなくなる
 - finalクラス宣言の先頭につけると クラスが拡張できなくなる
 - final変数宣言の先頭につけると 値の変更ができなくなる(定数扱い)
  
 
 11.4 Objectクラスの継承
 
・クラスの階層をつくる
 - サブクラスをさらに継承して、サブクラスのサブクラスを作成することができる 
 - クラスの継承が多く行われると、クラスの階層構造が生成される
 - 継承するとき、複数のスーパークラスを指定することはできない

・Objectクラスのしくみを知る
 - JavaのすべてのクラスはObjectクラスを継承している

toString()メソッドを定義する
 - toString()メソッドはオブジェクトを表す出力を行い、Objectクラスで定義されている
   RacingCar rc = new RacingCar();
   System.out.println(rc);
  のように、クラスのオブジェクト変数そのものが指定されると、toString()が呼ばれる
 - ふつうは toString()オーバーライドして利用する

equals()メソッドを使う
 - 2つのオブジェクトが同じかどうかを調べる

getClass()メソッドを使う
 - オブジェクトが属するクラスの情報を取得する
     
  
      
 演習
 
  演習のページへ