第10回 クラスの機能(2)

  
参考書 Lesson 9.4(参考書p.278)〜 Lesson 9.5
    
9 クラスの機能(つづき)
 
 9.4 コンストラクタをオーバーロードする(参考書 p.278)
 
・コンストラクタをオーバーロードする
 - コンストラクタをオーバーロードすることができる 
 - 引数の変数の型・個数が違うものにする
 
<コンストラクタをオーバーロードした例>
class Car
{
  public Car(){ // (※1)デフォルトコンストラクタ
     :
  }
  public Car( int n ){ // (※2)
     :
  }
  public Car( double g ){ // (※3)
     :
  }
  public Car( int n, double g ){ // (※4)
     :
  }
}

class Sample1
{
  public static void main(String[] args)
  {
    // 以下、4通りのオブジェクトの作成方法がある
    Car car1 = new Car();
// ※1が呼ばれる
    Car car2 = new Car( 4125 ); // ※2が呼ばれる
    Car car3 = new Car( 20.5 ); // ※3が呼ばれる
    Car car4 = new Car( 3516, 18.2 ); // ※4が呼ばれる
       :
  }
}
   
・別のコンストラクタを呼び出す
 - あるコンストラクタから、別のコンストラクタを呼び出す
 - 記述の無駄を省くことができる
 - 他のコンストラクタは this(); で呼び出す(引数によって区別する)
  
・コンストラクタを省略すると?
 - 自動的にデフォルトコンストラクタ(引数なしのコンストラクタ)が用意され、呼ばれる

・コンストラクタに修飾子をつける
 - コンストラクタにアクセス制限を設定して、オブジェクトの作成方法をコントロールする
 - 例えば、デフォルトコンストラクタの利用を禁止する、引数有りコンストラクタの利用を必須にする、など
 
<コンストラクタにprivateをつける>
class Car
{
  int capacity; // 乗車定員
  int num;
  double gas;
 
 
private Car(){ // デフォルトコンストラクタ、外からはアクセスできない
    capacity = 5; // 乗車定員は5人
  }
  public Car( int n, double g ){ // 引数有りのコンストラクタ
    this(); // Car()を呼び出す
    num = n;
    gas = g;
  }
}

class Sample2
{
  public static void main(String[] args)
  {

    Car car0 = new Car(); // ×、Car()はprivateでアクセスできない
    Car car1 = new Car( 3693, 15.2 );
    Car car2 = new Car( 8211, 35.7 );
       :
       :
  }
}
                 
    
  
 9.5 クラス変数、クラスメソッド
 
・インスタンス変数のしくみを知る
 - これまで利用してきた変数・メソッドは「インスタンス変数」、「インスタンスメソッド」と呼ぶ
 - オブジェクト(インスタンス)が新規に作成されるたびに、新しく独立した領域が確保される
 - 「インスタンス変数」、「インスタンスメソッド」はオブジェクト(インスタンス)に紐づけされる
  
・クラス変数とクラスメソッド
 - クラスに紐づけされている変数・メソッドを「クラス変数」、「クラスメソッド」と呼ぶ
 - クラス変数・メソッドの宣言は、頭に staticを追加する
 
<クラス変数の例>
class Car
{
  static int sum = 0;  // クラス変数(staticが付いている)

  int num;      // インスタンス変数
  double gas;   // インスタンス変数
     :
 
}
   
<クラスメソッドの例>
class Car
{
     :
  static void showSum(){  // クラスメソッドstaticが付いている)
     :
  }

  void setCar(int n,double g){ // インスタンスメソッド
     :
  }
  void show(){ // インスタンスメソッド
     :
  }
}
   
 - クラス変数は、各インスタンスから共通でアクセスできる変数
 下記のようにクラス変数、インスタンス変数を宣言した場合、下図のようなイメージになる
class Car
{
  static int sum = 0; // クラス変数
  int num// インスタンス変数
  double gas// インスタンス変数
     :
}

class Sample3
{
  public static void main(String[] args)
  {

    Car car1 = new Car();
    Car car2 = new Car();
    Car car3 = new Car();
 
      :
  }
}
   
 - car1car2car3 から sumにアクセスできる
 
・クラス変数、クラスメソッドの呼び出し方法
 - クラス名を介してアクセスする
class Car
{
  static int sum = 0; // クラス変数
  int num// インスタンス変数
  double gas// インスタンス変数
     :
  static void showSum(){
     :
  }
}

class Sample4
{
  public static void main(String[] args)
  {

    Car car1 = new Car(); // インスタンスの作成
        :
    Sytem.out.println( Car.sum ); // クラス変数にアクセス
   
Car.showSum(); // クラスメソッドの呼び出し

    car1.num = 1205;
// インスタンス変数にアクセス
    car1.gas = 10.8; // インスタンス変数にアクセス
        :
  }
}
      
・クラスメソッドについての注意
 - 「this.」は自分自身(インスタンス)を示すキーワード
   ただし、クラスメソッド内では「this.」は使えない --> どのインスタンスかを特定できないため
 - クラスメソッド内では インスタンス変数 にアクセスできない --> どのインスタンスかを特定できないため

<(1)クラスメソッドの中で「this.」は使えない>
     :
  static void void showSum() // クラスメソッド
  {

    System.out.println("車の台数 = " + this.sum ); // 誤り
        :
  }
     :
   
<(2)クラスメソッドの中でインスタンス変数にアクセスできない>
     :
  int num; // インスタンス変数
     :
  static void void showSum() // クラスメソッド
  {
    System.out.println("車の台数 = " + num ); // 誤り
        :
  }
     :
    
    
  
 演習
 
  演習問題へ