Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaのstatic変数とは?その特徴及び付けた場合と付けない場合の違いを解説

投稿日:2019年10月20日 更新日:

(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メンバとは?

「staticメンバ」とは「メンバ変数」(*注1)や「メソッド」(*注2)のうち、定義時に「static修飾子」を付けて定義したものを言います。

(図1)

(*注1)「メンバ変数」とは「クラス内&メソッドの外」で定義された変数で、オブジェクトの属性を表します。
(例:名前、顧客番号、残高、口座番号、住所、生年月日・・等々の「属性」を保持する変数)

 
(*注2)「メソッド」とはオブジェクトに対して行う「操作」の処理内容を定義するものです。
(例:預け入れ、引き出し、振り込み、積み立て・・等々の「操作」の処理ロジックを記述するメソッド)

目次にもどる

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

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Servlet(サーブレット)におけるフォワード(forward)とリダイレクト(redirect)の違い

<目次> (1) Servlet(サーブレット)におけるフォワード(forward)とリダイレクト(redirect)の違い  (1-1) フォワード(forward)とは?  (1-2) リダイレク …

JSP/Servletでログイン・ログアウト機能を作成する方法

<目次> (1) JSP/Servletでログイン・ログアウト機能を作成する方法  (1-1) ログイン   (1-1-1) 概要・構文   (1-1-2) サンプルプログラム  (1-2) ログアウ …

JSPとは?役割や基本文法およびHelloWorldのサンプルプログラムの紹介

(0)目次&概説 (1) JSPの基本  (1-1) JSPとは?  (1-2) JSPのHelloWorld (2) JSPの基本文法  (2-1) ディレクティブ  (2-2) アクションタグ   …

Javaでハッシュ値を計算する方法について

<目次> (1) Javaでハッシュ値を計算する方法について  (1-1) ハッシュを使った探索の概要  (1-2) ハッシュからアドレスを計算する方法  (1-3) サンプルプログラム (1) Ja …

Linuxでアプリケーションサーバを構築する手順の例

<目次> (1) Linuxでアプリケーションサーバを構築する手順の例  (1-1) APサーバの全体像  (1-2) APサーバの構築手順  (1-3) 各手順のURL (1) Linuxでアプリケ …

  • English (United States)
  • 日本語
Top