インスタンスからクラスメンバを参照する - 萌えJava超入門
第十七章
クラスメンバとインスタンスメンバの混在

インスタンスから
クラスメンバを参照する

インスタンスメソッドからクラスメンバを参照できます。
クラス変数を守らなければいけません。

目次


1.インスタンスからクラス変数を参照できる


クラスと、そのクラスから生成されたインスタンスの関係について説明します。

重要
  1. クラスメンバは、インスタンスメソッドの中に
    クラスメンバ名を記述することでアクセスできます。
  2. クラスメンバは、インスタンスと違って一つだけです。

先にサンプルコードを
見てもらった方がいいかな。
ポイントは changeClassValueメソッドだ。
は~い。
//Member_04.java
class Member_04 {

    //クラス変数
    static String classValue = "クラス変数";

    //インスタンス変数
    int no;
    String name;

    //コンストラクタ
    Member_04(int no, String name){
        this.no = no;
        this.name = name;
    }

    //クラス変数の表示
    static void printClassValue(){
      System.out.println("クラス変数 classValue = " + classValue);
    }

    //インスタンスからのクラス変数変更
    void changeClassValue(){
        classValue = no + ". " + name + " による変更";
    }
}

//Driver_04.java
class Driver_04{
  public static void main(String[] args){
      //インスタンス化
      Member_04 shiz = new Member_04(1, "館石静乃");
      Member_04 maya = new Member_04(2, "桜井真夜");
      Member_04 tema = new Member_04(3, "安堂てまり");

      System.out.println("\nインスタンスからクラス変数へのアクセス\n");
      Member_04.printClassValue();
      shiz.changeClassValue();
      Member_04.printClassValue();
      maya.changeClassValue();
      Member_04.printClassValue();
      tema.changeClassValue();
      Member_04.printClassValue();
  }
}


コマンドライン
>javac -encoding UTF-8 Driver_04.java
>java Driver_04

インスタンスからクラス変数へのアクセス

クラス変数 classValue = クラス変数
クラス変数 classValue = 1. 館石静乃 による変更
クラス変数 classValue = 2. 桜井真夜 による変更
クラス変数 classValue = 3. 安堂てまり による変更



解説
Member_04クラスの changeClassValueメソッドは、インスタンスメソッドです。
このインスタンスメソッドは、クラス変数である classValue に変更を加えます。
それぞれのインスタンスが持っている noname の値を書きこんだのです。

クラス変数 classValue は、どのインスタンスから参照しても同じ一つの変数であり、
どのインスタンスからもアクセスできる変数なのです。

クラスメンバは
共通で使えるんスね。
クラスは
仕事をインスタンス任せて
共有するメンバだけ持っている
元締めみたいなもんだな。
インスタンスからクラスへのアクセス
インスタンスからクラスへのアクセス



2.インスタンスからクラス変数を守る


クラス変数には、各インスタンスに共通する値を保存するのに適しています。
一方、どのインスタンスからも変更できてしまう危うさも持ち合わせています。
これらを考慮して、以下の様な使い方が一般的です。

クラス変数の使い方
  1. final修飾子で定数にして、public修飾子で共有する。
  2. private修飾子を与えたうえで、変数にアクセスするクラスメソッドを作成する。
    (変数の隠蔽)
  3. private修飾子で、クラスメソッドの中でのみ利用する。

(1.)の定数にして使うのが
圧倒的に多いだろう。
自分のインスタンス以外からも
使える。
MathクラスのPIがこれに該当します。
MathクラスのPI
public static final double PI = 3.14159265358979323846;

(2.)の方法は、
ゲームのキャラクターのクラスで
スコアに使ったりする。
HPがなくなった時点で
自分のポイントをスコアの変数に
加算する。

なんだか正直、
ちょっと面倒だわ。
ん~、確かに。
身の丈にあったプログラミングって
実際あると思う。
いいと思ったものから試すといいかも。


3.クラスメソッドにインスタンスメンバは書けない


クラスメソッドの中に、インスタンスメンバを記述することはできません。

//Member_06.java
class Member_06 {

    //クラス変数
    static String classValue = "クラス変数";

    //インスタンス変数
    int no;
    String name;

    //コンストラクタ
    Member_06(int no, String name){
        this.no = no;
        this.name = name;
    }

    //クラスからインスタンス変数を参照 NG
    static void printThisName(){
      System.out.println(this.name);
    }

    //インスタンスからのクラス変数を参照 OK
    void changeClassValue(){
        classValue = no + ". " + name + " による変更";
    }
}

//Driver_06.java
class Driver_06{
  public static void main(String[] args){
      //インスタンス化
      Member_06 shiz = new Member_06(1, "館石静乃");

      System.out.println("\nクラスからインスタンス変数へのアクセス\n");
      Member_06.printThisName();//NG
  }
}


コマンドライン
>javac -encoding UTF-8 Driver_06.java
.\Member_06.java:19: エラー: staticでない変数 thisを
staticコンテキストから参照することはできません
      System.out.println(this.name);
                         ^
エラー1個

なんかいけそうな気が
するんスけどね~。
クラスから見たインスタンスは
複数になるからダメなんだろう。
インスタンスメンバを使えるのはインスタンスの中だけです。




お疲れ様でした。




© 2019 awasekagami