(0)目次&概説
(1) static修飾子
(1-1) staticメンバとは?
(1-2) static変数
(1-2-1) static変数の説明と特徴
(1-2-2) static変数のサンプルコード
(1-3) staticメソッド
(1-3-1) staticメソッドの説明と特徴
(1-3-2) staticメソッドのサンプルコード
(1) static修飾子
(1-1) staticメンバとは?
(図1)
(*注1)「メンバ変数」とは「クラス内&メソッドの外」で定義された変数で、オブジェクトの属性を表します。
(例:名前、顧客番号、残高、口座番号、住所、生年月日・・等々の「属性」を保持する変数)
(例:預け入れ、引き出し、振り込み、積み立て・・等々の「操作」の処理ロジックを記述するメソッド)
(1-2) static変数
(1-2-1) static変数の説明と特徴
static修飾子を用いて宣言した変数を「クラス変数」(または「static変数」)と呼び、非staticな変数を「インスタンス変数」と呼びます。特徴としては下記の点があります。
| 変数名 | 定義&概要 | 用途&特徴 |
| メンバ変数 ∟インスタンス変数 |
・static修飾子「なし」で宣言したメンバ変数の呼称 | (#1)変数として使用される事が多い。 (#2)クラスから生成された複数のオブジェクト間で共有されない(オブジェクト毎に領域を確保している) (#3)[クラス名].[メンバ変数名]と指定してアクセスできない |
| メンバ変数 ∟クラス変数 |
・static修飾子「あり」で宣言したメンバ変数の呼称 ・別名は「static変数」とも呼びます ・クラスの「メンバ変数」と「メソッド」にのみ指定できます |
(#4)定数として使用される事が多い。 (#5)クラスから生成された全てのオブジェクトで共有される (#6)[クラス名].[メンバ変数名]と指定してアクセスできる (#7)クラスからオブジェクトを生成せずに利用できる(個々のオブジェクトとは関係なく存在する) |
(1-2-2) static変数のサンプルコード
上記(#5)の性質を実際に確認した例が下記です。
(図2)

■サンプルプログラム
//[StaticDetail.java]
package training;
public class StaticDetail {
//クラス変数(Static)と、インスタンス変数(非Static)を両方用意
static String stat="Static Variable";
String nstat="Non-Static Variable";
//クラスメソッド(Static)と、インスタンスメソッド(非Static)を両方用意
public static void StaticMethod(String a_word) {
System.out.println("[Static Method] is called with ["+a_word+"]");
}
public void NonStaticMethod(String a_word) {
System.out.println("[Non-Static Method] is called with ["+a_word+"]");
}
}
//[StaticMain.java]
//Mainメソッドを記述
package training;
public class StaticMain {
public static void main(String args[]) {
//StaticDetail.StaticMethod(StaticDetail.stat);
StaticDetail sd1 = new StaticDetail();
StaticDetail sd2 = new StaticDetail();
StaticDetail sd3 = new StaticDetail();
System.out.println("sd1 output : "+sd1.stat);
System.out.println("sd2 output : "+sd2.stat);
System.out.println("sd3 output : "+sd3.stat);
}
}
■実行結果
sd1 output : Static Variable sd2 output : Static Variable sd3 output : Static Variable
上記(#6)(#7)の性質を実際に確認した例が下記です。
(図3)

■サンプルプログラム
//[StaticDetail.java]
package training;
public class StaticDetail {
//クラス変数(Static)と、インスタンス変数(非Static)を両方用意
static String stat="Static Variable";
String nstat="Non-Static Variable";
//クラスメソッド(Static)と、インスタンスメソッド(非Static)を両方用意
public static void StaticMethod(String a_word) {
System.out.println("[Static Method] is called with ["+a_word+"]");
}
public void NonStaticMethod(String a_word) {
System.out.println("[Non-Static Method] is called with ["+a_word+"]");
}
}
//[StaticMain.java]
//Mainメソッドを記述
package training;
public class StaticMain {
public static void main(String args[]) {
//クラス変数を[クラス名].[メンバ変数名]で呼出し
//クラスメソッドを[クラス名].[メソッド名]で呼出し
StaticDetail.StaticMethod(StaticDetail.stat);
}
}
■実行結果
[Static Method] is called with [Static Variable]
(1-3) staticメソッド
(1-3-1) staticメソッドの説明と特徴
static修飾子を用いて宣言したメソッドを「クラスメソッド」と呼び、、非staticな変数を「インスタンスメソッド」と呼びます。特徴としては下記の点があります。
| メソッド名 | 定義&概要 | 用途&特徴 |
| メソッド ∟インスタンスメソッド |
・static修飾子「なし」で宣言したメソッドの呼称 | (#1)同一クラス内のあらゆるメンバ変数やメソッドを操作できる |
| メソッド ∟クラスメソッド |
・static修飾子「なし」で宣言したメソッドの呼称 | (#2)クラスからオブジェクトを生成せずに利用できる(個々のオブジェクトとは関係なく存在する) (#3)[クラス名].[メソッド名]と指定してアクセスできる (#4)staticなメソッドからは、同一クラス内の非staticな変数やメソッドは操作できない(インスタンス変数・インスタンスメソッド) |
上記(#2)(#3)の性質を実際に確認した例は「(1-2) static変数」の(図3)になります。
(1-2-2) static変数のサンプルコード
上記(#4)の性質を実際に確認した例が下記です。
■サンプルプログラム
//(#5)確認用のプログラム
package training;
public class StaticDetail {
//クラス変数(Static)と、インスタンス変数(非Static)を両方用意
static String stat="Static Variable";
String nstat="Non-Static Variable";
//クラスメソッド(Static)と、インスタンスメソッド(非Static)を両方用意
public static void StaticMethod(String a_word) {
System.out.println("[Static Method] is called with ["+a_word+"]");
}
public void NonStaticMethod(String a_word) {
System.out.println("[Non-Static Method] is called with ["+a_word+"]");
}
//クラスメソッド(Static)の中でそれぞれ下記を実行
public static void main(String args[]) {
//(1) クラスメソッド(Static)の中でクラスメソッド(Static)を実行(引数もクラス変数(Static))
//[正常終了の想定]
StaticMethod(stat);
//(2) クラスメソッド(Static)の中でクラスメソッド(Static)を実行(ただし、引数はインスタンス変数(非Static))
//[エラーの想定]
StaticMethod(nstat);
//(3) クラスメソッド(Static)の中でインスタんメソッド(非Static)を実行(ただし、引数はクラス変数(Static))
//[エラーの想定]
NonStaticMethod(stat);
}
}
■実行結果(エラーメッセージ
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Cannot make a static reference to the non-static field nstat
Cannot make a static reference to the non-static method NonStaticMethod(String) from the type StaticDetail
at training.StaticDetail.main(StaticDetail.java:18)
(図4)
