Javaのstaticメソッドとは?|メソッドの呼び出し方も紹介!

- システム
エンジニア - staticメソッドって何ですか?
- プロジェクト
マネージャー - staticメソッドはインスタンス化による影響を受けない処理をするメソッドのことを言います。
staticメソッドとは?
Javaではメソッドの定義をする際に、static修飾子をつけない非staticメソッドと、static修飾子をつけたstaticメソッドがあります。
Javaにおいて通常メソッドは、クラスをインスタンス化してから使用します。しかし、static修飾子を付与したメソッドは、クラスのインスタンス化なしに直接呼び出して使用します。
いくらインスタンスを生成しても、参照先の実体は1つだけ確保された状態ということです。実際のコードを掲載しているので、照らし合わせてみてください。
定義方法
Javaのstaticメソッドの定義方法は、通常のメソッドの戻り値のデータ型定義の前にstatic修飾子をつけます。
1
2
3
4
5
6
7
8
|
public class StaticSample {
public void method_none() {
System.out.println(""static修飾子なしです"");
}
public static void method_static() { //voidの前にstatic修飾子をつける
System.out.println(""static修飾子ありです"");
}
}
|
呼び出し方
Javaのstaticメソッドの呼び出し方は、クラス名.メソッド名()とします。前述のStaticSampleクラスを例にすると以下のようになります。
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) {
//staticメソッドはクラス名.メソッド名()で呼び出す。
StaticSample.method_static();
//非staticメソッドはインスタンスが必要。
StaticSample sample = new StaticSample();
sample.method_none();
}
|
Javaを初めて学ぶ際に覚えるmainメソッドの、public static void main(String[] args)もstatic修飾子を付与しています。ちなみにstatic修飾子は、メソッド以外にもメンバ変数や内部クラスやimportにも付与可能です。
またstatic initializserなどもあります。今回はメソッドに対するstaticについて説明しますので、気になった方は調べてみてください。
特徴
ここまで、Javaのstaticメソッドの定義方法と呼び出し方を見てきました。次に、staticメソッドの特徴を説明します。は3つの特徴を取り上げているので、順に説明していきます。
Javaをこれから勉強する人はもちろん、すでに学習したことがある人も復習として、ぜひこの記事を参考にしてください。
参照先の実体は1つ
Javaでは、クラスに定義した変数やメソッドはインスタンス化した際に、メモリ空間にその領域が確保されます。上記のコードサンプルの、StaticSampleクラスを少し修正して説明します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class StaticSample {
private int callCount = 0;
private static int staticCallCount = 0;
public void method_none() {
System.out.println(""static修飾子なしです。呼び出し回数:"" + callCount);
callCount++;
}
public static void method_static() {
System.out.println(""static修飾子ありです。呼び出し回数:"" + staticCallCount);
staticCallCount++;
}
public static void main(String[] args) {
//インスタンス化1つ目
StaticSample sample_1 = new StaticSample();
sample_1.method_none();
StaticSample.method_static(); //staticメソッドはクラス名.メソッド名()で呼び出す。
//インスタンス化2つ目
StaticSample sample_2 = new StaticSample();
sample_2.method_none();
StaticSample.method_static(); //staticメソッドはクラス名.メソッド名()で呼び出す。
}
}
|
上記のsample_1のmethod_none()と、sample_2のmethod_none()は別のメモリ空間で処理されます。
しかし、StaticSample.method_static()は同じメモリ空間で処理されるため、staticCallCountの値が保持されたまま処理されます。具体的な実行結果は、以下のようになります。
1
2
3
4
|
static修飾子なしです。呼び出し回数:0
static修飾子ありです。呼び出し回数:0
static修飾子なしです。呼び出し回数:0
static修飾子ありです。呼び出し回数:1
|
static修飾子なしの出力は、2回目も「呼び出し回数:0」ですが、static修飾子ありの出力は、「呼び出し回数:0」と「呼び出し回数:1」という違いがあります。
staticメソッド内での参照制限
staticメソッド内で参照できるメンバ変数とメンバメソッドには、以下のような違いがあります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private int callCount = 0;
private static int staticCallCount = 0;
public void method_none() {
System.out.println(""static修飾子なしです。呼び出し回数:"" + callCount);
method_static(); //staticメソッド呼び出し可能。
callCount++;
staticCallCount++; //static変数参照可能。
}
public static void method_static() {
System.out.println(""static修飾子ありです。呼び出し回数:"" + staticCallCount);
// method_none(); //非staticメソッド呼び出し不可能。
staticCallCount++;
// callCount++; //非static変数参照不可能。
}
|
staticメソッド内からstatic変数やstaticメソッドは参照できるが、非static変数や非staticメソッドは参照できず、上記のソースでコメントアウトを解除するとJavaのコンパイル時にエラーとなります。
オーバーライドできない
staticメソッドはオーバーライドできません。StaticSampleクラスを親クラスに持つ、StaticSampleChildクラスを作成している前提でコードを見ていきましょう。
1
2
3
4
5
6
7
8
9
10
11
|
public class StaticSampleChild extends StaticSample {
@Override
public void method_none() {
System.out.println(""static修飾子なしです。childクラスからの呼び出し。"");
}
// @Override //IDEによっては@Overrideのコメントアウトを外せばエラーや警告が出力されます
public static void method_static() {
System.out.println(""static修飾子ありです。childクラスからの呼び出し。"");
}
}
|
このようにstaticメソッドをオーバーライドしようとしてもできません。これは、staticメソッドがクラス固有であることを保証するためです。このような場合には別のメソッド名にするか、そもそものクラス設計を見直す方が良いでしょう。
- システム
エンジニア - メソッドのクラスを使うことで、さまざまな呼び出し方ができるのですね。
- プロジェクト
マネージャー - 実際に使ってみて、自由にstaticメソッドを使えるようになりましょう。
Javaのstaticメソッドを使ってみよう
この記事では、Javaのstaticメソッドの使い方を見てきました。非staticメソッドとの違いや使い方がわかったでしょうか。
実際に自身の手を動かしてコーディングしてみてください。そしてstatic修飾子の利用シーンを増やして自由に使えるようにしていきましょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)