第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) にチェックを入れる
1 | package jp.co.f1.basic.ch06; |
13 | System.out.println( "パソコンを作成しました。" ); |
15 | public void setOsMemory(String os, int memory) { |
18 | System.out.println( "OSを「" + os + "」にメモリを「" + memory + "MByte」に変更しました。" ); |
21 | System.out.println( "パソコンのOSは「" + os + "」です。" ); |
22 | System.out.println( "メモリサイズは「" + memory + "MByte」です。" ); |
24 | public static void showSum() { |
25 | System.out.println( "■パソコンは合計" + this .sum + "台作成されています。" ); |
26 | System.out.println( "パソコンのメモリは「" + memory + "MByte」です。" ); |
31 | public class NoAccessFromClassMember { |
32 | public static void main(String[] args) { |
36 | Computer4 com1 = new Computer4(); |
37 | com1.setOsMemory( "WindowsXP" , 2048 ); |
41 | Computer4 com2 = new Computer4(); |
42 | com2.setOsMemory( "Windows2000" , 512 ); |
実行結果
クラスメソッド内からのルールに従っていない為、コンパイルエラーになり実行できません。
Eclipse上でのソースファイル結果
解説
3~27行目のComputer4クラス内24行~28行のshowSum()メソッドの処理で、25行クラスメソッドであるsumに「this」がついています。26行でインスタンス変数のmemoryにアクセスし、27行でインスタンスメソッドのshowメソッドを呼び出しています。
9 | System.out.println( "パソコンのOSは「" + os + "」です。" ); |
10 | System.out.println( "メモリサイズは「" + memory + "MByte」です。" ); |
12 | public static void showSum(){ |
13 | System.out.println( "■パソコンは合計" + this .sum + "台作成されています。" ); |
14 | System.out.println( "パソコンのメモリは「" + memory + "MByte」です。" ); |
25行目のようにクラス変数sumに「this」をつけるとエラーになります。
1 | System.out.println( "■パソコンは合計" + this .sum + "台作成されています。" ); |
26、27行目のようにクラスメソッドから、インスタンスメンバにアクセスしてもエラーになります。
1 | System.out.println( "パソコンのメモリは「" + memory + "MByte」です。" ); |
ポイント
- クラスメンバには以下の制約がある。
- クラスメンバに「this」キーワードは利用できない。
- クラスメソッドからインスタンスメンバへアクセスはできない。
インスタンスメンバとクラスメンバの使い分け
オブジェクトごとに異なる値を設定したいのであればインスタンスメンバ、全てのオブジェクト共通の値として使いたいならクラスメンバで、そのどちらかの目的に応じて使い分けます。
NEXT>> 6.3 本章のまとめ