staticメンバー、staticクラス
通常のメンバーは、インスタンスごとに個々の値を持ちます。Carクラスを基にインスタンスを3回生成すると、車のオブジェクトが3台分できます。それぞれ、スピードを記憶できたり、ガソリンを積んだりしていますが、3台とも別々で動いているわけです。
しかし、クラスのメンバーの中で「static」を指定すると、静的メンバーとなります。つまり、複数のオブジェクトから1つのデータを共有して利用することができるようになります。また、staticメンバーはインスタンスを生成しなくても利用することができます。
静的フィールド変数定義の書式 |
---|
アクセス修飾子 static データ型 変数名; |
静的メソッド定義の書式 |
---|
アクセス修飾子 static 戻り値の型 メソッド名(引数リスト){ 処理; } |
○ プログラム
次のようにCarクラスにstaticメンバーを追加してください。
Car.java
- public class Car{
- //フィールド
- //public int speed; //スピード情報
- private int speed; //スピード情報(修正)
- //public double gas; //ガソリン情報
- private double gas; //ガソリン情報(修正)
- private static String maker = "ダッシュ"; //メーカー情報
- //ガソリンを給油するメソッド
- public void setGas(){
- //オーバーロードしているメソッドを呼び出す
- this.setGas(20);
- }
- public void setGas(double gas){
- //止まっている場合は指定したガソリン量を給油
- if(this.speed == 0){
- this.gas += gas;
- }
- }
- //メーカーを紹介するメソッド
- public static String introductionMaker(){
- return "この車は" + maker + "製です。";
- }
- }
○ クラス図
○ 解説
9行目では、メーカー名を扱うフィールドを宣言しています。このフィールドはstaticキーワードがついているので、インスタンスを生成しなくても使えます。今回はprivateとなっているので、内部からしか使えませんが、このクラスのオブジェクトが複数生成されたとしてもひとつしか用意されません。
75~77行目では、staticメソッドを定義しています。staticメソッド内でフィールドやメソッドを参照する場合は、staticなメンバーを指定できます。インスタンスメンバー(インスタンスを生成しないと使用できないメンバー)は利用できません。
○ プログラム
staticメンバーを利用する記述を追加しましょう。
CarTest.java
- public static void main(String[] args) throws Exception{
- while(true){
- //操作を入力
- System.out.print("1)加速 2)減速 3)給油 4)メーカー 9)終了:");
- String inputdata = br.readLine();
- //操作によって分岐する
- switch (inputdata){
- case "1":
- //加速する
- car.speedUp(5);
- showData(car);
- break;
- case "2":
- //減速する
- car.speedDown(5);
- showData(car);
- break;
- case "3":
- //給油する
- car.setGas(35);
- showData(car);
- break;
- case "4":
- //メーカーを表示する
- System.out.println(Car.introductionMaker());
- break;
- case "9":
- //プログラムを終了する
- return;
- }
- }
- }
○ 解説
メーカー紹介のメニューを追加しました。52行目でメーカー紹介のIntroductionMakerメソッドの呼び出しをしています。このメソッドはstaticメソッドなので、「クラス名.IntroductionMaker()」となっていることに注目してください。