(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)