staticメンバ、staticクラス

 通常のメンバは、インスタンスごとに個々の値を持ちます。Carクラスを基にインスタンスを3回生成すると、車のオブジェクトが3台分できます。それぞれ、スピードを記憶できたり、ガソリンを積んだりしていますが、3台とも別々で動いているわけです。

 しかし、クラスのメンバの中で「static」を指定すると、静的メンバとなります。つまり、複数のオブジェクトから1つのデータを共有して利用することができるようになります。また、staticメンバはインスタンスを生成しなくても利用することができます。

静的フィールド変数定義の書式
アクセス修飾子 static データ型 変数名;

静的メソッド定義の書式
アクセス修飾子 static 戻り値の型 メソッド名(引数リスト)
{
 処理;
}

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 StaticTest

サンプルダウンロード

○ 作成の準備

 Carクラスにstaticメンバを追加しましょう。「PropertyTest」をコピーしてプロジェクトを作成してください。

○ プログラム

 次のように記述を追加・修正してください。

Car.cs

  1. class Car
  2. {
  3.  //フィールド==========
  4.  private int speed;  //スピード
  5.  private double gas;  //ガソリン情報
  6.  private static string maker = "ダッシュ";  //メーカー名
  7.  //プロパティ==========
  8.  //スピード参照用
  9.  public int Speed
  10.  {
  11.   get
  12.   {
  13.    return this.speed;
  14.   }
  15.  }
  16.  //ガソリン参照・設定用
  17.  public double Gas
  18.  {
  19.   set
  20.   {
  21.    //止まっている場合は指定したガソリン量を給油
  22.    if (this.speed == 0)
  23.    {
  24.     this.gas += value;
  25.    }
  26.   }
  27.   get
  28.   {
  29.    return this.gas;
  30.   }
  31.  }
  32.  //コンストラクター==========
  33.  public Car() : this(20)
  34.  {
  35.  }
  36.  public Car(double gas)
  37.  {
  38.   this.speed = 0;
  39.   this.gas = gas;
  40.  }
  41.  //メソッド==========
  42.  //加速させるメソッド
  43.  public void SpeedUp(int sp)
  44.  {
  45.   //ガソリンを減らす
  46.   this.gas -= sp / 10.0;
  47.   if(this.gas < 0) //ガソリンがマイナスになる場合
  48.   {
  49.    //ガソリンを0に補正し、スピードを増やさない
  50.    this.gas = 0;
  51.   }
  52.   else
  53.   {
  54.    //スピードを増やす
  55.    this.speed += sp;
  56.   }
  57.  }
  58.  //減速させるメソッド
  59.  public void SpeedDown(int sp)
  60.  {
  61.   //スピードを減らす
  62.   this.speed -= sp;
  63.   if(this.speed < 0) //スピードがマイナスになる場合
  64.   {
  65.    //スピードを0に補正する
  66.    this.speed = 0;
  67.   }
  68.  }
  69.  //メーカーを紹介するメソッド
  70.  public static string IntroductionMaker()
  71.  {
  72.   return "この車は" + maker + "製です。";
  73.  }
  74. }

○ クラス図

○ 解説

 14行目では、メーカー名を扱うフィールドを宣言しています。このフィールドはstaticキーワードがついているので、インスタンスを生成しなくても使えます。今回はprivateとなっているので、内部からしか使えませんが、このクラスのオブジェクトが複数生成されたとしてもひとつしか用意されません。

 85~87行目では、staticメソッドを定義しています。staticメソッド内でフィールドやメソッドを参照する場合は、staticなメンバを指定できます。インスタンスメンバ(インスタンスを生成しないと使用できないメンバ)は利用できません。

○ プログラム

 staticメンバを利用する記述を追加しましょう。

Program.cs

  1. static void Main(string[] args)
  2. {
  3.  //インスタンスを生成する
  4.  Car car = new Car(40);
  5.  //現在の状態を表示する
  6.  ShowData(car);
  7.  while (true)
  8.  {
  9.   //操作を入力
  10.   Console.Write("1)加速 2)減速 3)給油 4)メーカー紹介 9)終了:");
  11.   string inputdata = Console.ReadLine();
  12.   //操作によって分岐する
  13.   switch (inputdata)
  14.   {
  15.    case "1":
  16.     //加速する
  17.     car.SpeedUp(5);
  18.     ShowData(car);
  19.     break;
  20.    case "2":
  21.     //減速する
  22.     car.SpeedDown(5);
  23.     ShowData(car);
  24.     break;
  25.    case "3":
  26.     //給油する
  27.     car.Gas = 35;
  28.     ShowData(car);
  29.     break;
  30.    case "4":
  31.     //メーカーを表示する
  32.     Console.WriteLine(Car.IntroductionMaker());
  33.     break;
  34.    case "9":
  35.     //プログラムを終了する
  36.     return;
  37.   }
  38.  }
  39. }

○ 解説

 メーカー紹介のメニューを追加しました。52行目でメニュー紹介のIntroductionMakerメソッドの呼び出しをしています。このメソッドはstaticメソッドなので、「クラス名.IntroductionMaker()」となっていることに注目してください。

インスタンスメンバとstaticメンバの例
インスタンスメンバとstaticメンバの例

前へ   次へ