第6章 クラスメンバとインスタンスメンバ

6.2 クラスメンバの注意点

クラスメンバを利用していくと、これまで学習してきた内容が適応できない場合が出てきます。それについて説明を行っていきます。

6.2.1 クラスメンバ利用時の制約について

クラスメンバを利用するうえでの制約を以下に示します。

  • クラス変数には「this」キーワードは使えない。
  • クラスメソッドからインスタンスメンバへはアクセスできない。

凡例:クラス変数に「this」キーワードが使えない

「this」キーワードは「オブジェクト自身の」という意味になります。クラスメンバはクラス自身に関連付けられており、オブジェクト自身のメンバには関連付けられないため「this」キーワードをつけることができません。

凡例:クラスメソッド内からインスタンスメンバへアクセスできない

6.2.2 クラスメンバの制約確認サンプル

クラスメンバの制約を確認するプログラムです。このプログラムはコンパイルエラーが発生する為、実行することはできません。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch06
③ 名前: NoAccessFromClassMember
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

1package jp.co.f1.basic.ch06;
2 
3class Computer4 {
4  private String os;
5  private int memory;
6  public static int sum;
7 
8  // コンストラクタ
9  public Computer4() {
10    this.os = null;
11    this.memory = 0;
12    sum++;
13    System.out.println("パソコンを作成しました。");
14  }
15  public void setOsMemory(String os, int memory) {
16    this.os = os;
17    this.memory = memory;
18    System.out.println("OSを「" + os + "」にメモリを「" + memory + "MByte」に変更しました。");
19  }
20  public void show() {
21    System.out.println("パソコンのOSは「" + os + "」です。");
22    System.out.println("メモリサイズは「" + memory + "MByte」です。");
23  }
24  public static void showSum() { // クラスメソッド
25    System.out.println("■パソコンは合計" + this.sum + "台作成されています。"); // クラス変数にthisでアクセス
26    System.out.println("パソコンのメモリは「" + memory + "MByte」です。"); // インスタンス変数にアクセス
27    show(); // インスタンスメソッドへアクセス
28  }
29}
30 
31public class NoAccessFromClassMember {
32  public static void main(String[] args) {
33    Computer4.sum = 0; // クラス変数sumにアクセスし0で初期化
34    Computer4.showSum(); // クラスメソッドshowSumにアクセス1回目
35 
36    Computer4 com1 = new Computer4();
37    com1.setOsMemory("WindowsXP", 2048);
38    com1.show();
39    Computer4.showSum(); // クラスメソッドshowSumにアクセス2回目
40 
41    Computer4 com2 = new Computer4();
42    com2.setOsMemory("Windows2000", 512);
43    com2.show();
44    Computer4.showSum(); // クラスメソッドshowSumにアクセス3回目
45  }
46}

実行結果
クラスメソッド内からのルールに従っていない為、コンパイルエラーになり実行できません。

Eclipse上でのソースファイル結果

解説
3~27行目のComputer4クラス内24行~28行のshowSum()メソッドの処理で、25行クラスメソッドであるsumに「this」がついています。26行でインスタンス変数のmemoryにアクセスし、27行でインスタンスメソッドのshowメソッドを呼び出しています。

1class Computer04 {
2  private String  os;
3  private int    memory;
4  public static int sum;
5 
6  …省略…
7 
8  public void show(){
9    System.out.println("パソコンのOSは「" + os + "」です。");
10    System.out.println("メモリサイズは「" + memory + "MByte」です。");
11  }
12  public static void showSum(){
13    System.out.println("■パソコンは合計" + this.sum + "台作成されています。");
14    System.out.println("パソコンのメモリは「" + memory + "MByte」です。");
15    show();
16  }
17}

25行目のようにクラス変数sumに「this」をつけるとエラーになります。

1System.out.println("■パソコンは合計" + this.sum + "台作成されています。");

26、27行目のようにクラスメソッドから、インスタンスメンバにアクセスしてもエラーになります。

1System.out.println("パソコンのメモリは「" + memory + "MByte」です。");
2show();
ポイント
  • クラスメンバには以下の制約がある。
  • クラスメンバに「this」キーワードは利用できない。
  • クラスメソッドからインスタンスメンバへアクセスはできない。
インスタンスメンバとクラスメンバの使い分け

オブジェクトごとに異なる値を設定したいのであればインスタンスメンバ、全てのオブジェクト共通の値として使いたいならクラスメンバで、そのどちらかの目的に応じて使い分けます。

NEXT>> 6.3 本章のまとめ

f