【2025】JAVAのstaticとは?使われる主なシーンや注意点を解説!

Javaのstaticは各要素の動きを一変させる強力な修飾子です。それほど意識せずに使っている方も多いですが、本質を理解するとメモリ管理やアクセス簡略化など数々の恩恵を受けられます。

本記事ではJavaにおけるstaticが活躍する具体的なシーンから、staticクラス・メソッド・変数などの使い方まで詳しく解説します。加えて注意点やよくある疑問にも触れているので、ぜひ参考にしてください。

JAVAのstatic修飾子とは何?

Javaのstatic修飾子は、変数やメソッドを「クラスそのもの」に結びつけるためのキーワードのことです。

通常、クラスからオブジェクトをたくさん作ると、そのオブジェクトごとに変数やメソッドが用意されます。しかしstaticを付けると、オブジェクトとは関係なくクラスに直接ひとつだけそれらが存在するようになります。

つまり同じ情報を多くのオブジェクトで共有できるほか、使いたいメソッドをすぐに呼び出せるようになるといったメリットがあります。また、staticメソッドはオブジェクトを作らなくても呼び出せるので、ちょっとした計算やメッセージの表示などに使うと、コードが簡略化できるのも利点です。

ただ記事後半でも解説しますが、staticメソッドの中では「this」が使えないため、オブジェクト特有の変数やメソッド(非staticなもの)にはアクセスできません。これは「staticメソッドはクラスと結びついていて、オブジェクトの情報を持っていない」という仕組みによるものです。

staticは便利な機能ではあるものの使える範囲に限りがあるので、状況に合わせて正しく使う必要があります。なお、staticの概要を一覧表にまとめると、以下のようになります。

役割クラス直下で共有されるメソッドや変数を定義する
利用シーン
  • インスタンス生成不要の処理
  • 定数宣言
  • メモリ使用量を抑えたい場合

など

メリット
  • インスタンスを作らずに呼び出すことが可能になる
  • メモリを節約できる
  • コードの可読性向上が期待できる
デメリット/注意
  • インスタンス変数やthisへのアクセスができない
  • 複雑な依存関係を招きやすい

そもそもstaticとは?

そもそも「static」は英語で「静的な」「変わらない」といった意味をもつ言葉です。何かが固定されて動かない状態を指します。

Javaにおけるstaticも、この意味に近い使われ方をしています。通常、クラスの各要素はオブジェクトごとに作られますが、staticを付けるとそれらはクラスに属し、オブジェクトを作らなくても使えるようになり、つまり、「static=クラスに直接ひもづく」ことを意味しています。

JAVAのstatic修飾子が使われる主なシーン

JAVAのstatic修飾子が使われる主なシーン

JAVAのstatic修飾子が使われる主なシーンとしては、以下が挙げられます。

変数すべてのオブジェクトで共有の値やデータをつくりたいとき
メソッドオブジェクトを作らなくても使えるメソッドを定義したいとき
ブロック初めてクラスが使われたとき、処理を一回だけ実行したいとき(初期設定など)

一般的にJavaでは、ラスの変数はオブジェクトそれぞれに作られますが、staticの利用によって全オブジェクトが共通の値やデータを所持するようになります

また通常では不可能ですが、staticを使えば「オブジェクトなしのメソッド」が使えるようになったり、初期設定時に1回限りの処理を行うときにも重宝します。

JAVAのstaticの使い方

ここではJavaのstaticの使い方として、以下のパターン別にくわしく紹介していきます。

  1. static classで使う場合
  2. staticメソッドとして使う場合
  3. static変数として使う場合
  4. static finalで定数にする場合
  5. static importで簡略化する場合

static classで使う場合

static classで使う場合

Javaでは、クラスの中に別のクラスをつくることができます。

通常の「内部クラス」は、外部クラスのインスタンスが必要ですが、staticを付けると外部クラスのインスタンスなしで使えるようになります。

class Outer {
static class Inner {
void showMessage() {
System.out.println(“私はstaticクラスです!”);
}
}
}

// staticクラスは外部クラスのインスタンスなしで使える
public class Main {
public static void main(String[] args) {
Outer.Inner obj = new Outer.Inner(); // ←外部クラスのインスタンスが不要
obj.showMessage();
}
}

実行結果:

私はstaticクラスです!

上記は「Inner」クラスに「showMessage()」を定義し、「Main」クラスで「Outer.Inner」を直接呼び出し実行しています。

「Outer.Inner obj = new Outer.Inner();」の部分で、外部クラスなしでオブジェクトを作っています。ここは通常の内部クラス(staticなし)だと、外部のオブジェクトが必要になります。

staticメソッドとして使う場合

staticメソッドとして使う場合

こちらはインスタンスを作らずに直接呼び出せるメソッドのことをいいます。

通常はオブジェクトを作らないと使えませんが、staticを付けるとクラス名から直接アクセスできます。

class Utility {
static void greet() {
System.out.println(“こんにちは!これはstaticメソッドです。”);
}
}

public class Main {
public static void main(String[] args) {
// クラス名から直接メソッドを呼び出し
Utility.greet();
}
}

実行結果:

こんにちは!これはstaticメソッドです。
普通のメソッド(staticなし)だと、「Utility obj = new Utility();」などと書いてオブジェクトを別途作らないと呼び出せません。
上記では「Utility.greet();」で、直接呼び出しています。

static変数として使う場合

static変数として使う場合

Javaでは一般的に変数はオブジェクトごとに作られますが、staticを付けると、すべてのオブジェクトで1つの値を共有できます。

全体のカウントを管理する場合や、設定値を保持する際に便利です。

class Counter {
static int count = 0; // 全オブジェクトで共有

Counter() {
count++; // インスタンスが作られるたびに増加
}
}

public class Main {
public static void main(String[] args) {
new Counter();
new Counter();
new Counter();

System.out.println(“作られたインスタンスの数: ” + Counter.count);
}
}

実行結果:
作られたインスタンスの数: 3
上記は、「Counter」クラスの「count」をstaticにすることで、すべてのオブジェクトで共有しています。
さらに上記の「Counter.count」のように、クラス名で直接アクセスすることも可能です。

static finalで定数にする場合

static finalで定数にする場合

static final を付けると、変数の値を変更できない「定数」 になります。

たとえば円周率や税率のような「変わらない値」を誤って値を変更してしまうミスを防ぐときに便利です。

class MathConstants {
static final double PI = 3.14; // 定数の宣言
}

public class Main {
public static void main(String[] args) {
System.out.println(“円周率: ” + MathConstants.PI);

// MathConstants.PI = 3.1415; // エラー(値を変更できない)
}
}

実行結果:
円周率: 3.14
上記は「static final double PI = 3.14;」で定数を定義、そして「Main」で「MathConstants.PI」を呼び出し、値を取得しています。
「final」が付いているので、値を変更しようとするとエラーになるのがポイントです。

static importで簡略化する場合

static importで簡略化する場合

「static import」を利用すると、別のクラスに定義されたstaticメンバを、クラス名を付けずに直接参照できるようになります。そのためコードの記述が短くシンプルになり、よく使う要素を手軽に呼び出せます。

以下のようにMathクラスのsqrt()メソッドやPI定数を毎回「Math.」と書かずに、直接利用できるため、記述ミスの軽減にもつながります。

import static java.lang.Math.*; // Mathクラスのstaticメンバを全てインポート

public class Main {
public static void main(String[] args) {
double result = sqrt(16); // ←Math.sqrt(16)と同じ意味
System.out.println(“16の平方根: ” + result);
System.out.println(“円周率: ” + PI); // ←Math.PIと同じ意味
}
}

実行結果:

16の平方根: 4.0
円周率: 3.141592653589793

なおJavaには、エラーを適切に処理する重要な例外処理「try-catch」というものが存在します。以下の記事で詳しく紹介していますので、気になる方はぜひご一読ください。

【2025】Java例外処理「try-catch」の使い方をわかりやすく解説!おすすめ講座も紹介

JAVAのstaticを使用する際の注意点

JAVAのstaticを使用する際の注意点

ここでは、JAVAのstaticを使用する際の注意点として、以下の2つをご紹介します。

  1. thisへのアクセスは静的メソッドからは行えない
  2. 非staticメソッドや変数を使った処理はできない

thisへのアクセスは静的メソッドからは行えない

thisへのアクセスは、静的メソッドからは行えない点に注意が必要です。

なぜなら「this」はオブジェクトそのものを指すワードなのに対し、staticメソッドはオブジェクトなしで動くからです。

非staticメソッドや変数を使った処理はできない

staticメソッド内では、オブジェクトに依存する非staticな変数やメソッドを直接使うことができません。

もし使いたい場合は、オブジェクトを作ってから利用する必要があり、これを守らないとエラーとなってしまうので気をつけましょう。

なお、Javaにはエラーや警告を減らすための機能「アノテーション」が存在します。興味のある方は、ぜひ以下の記事もご覧ください。

【2025】Javaのアノテーションとは?作り方と使い方やメリットまで解説

JAVAのstaticに関するよくある質問

最後に、Javaのstaticにまつわるよくある質問に解答していきます。

staticはなぜつける?

つけることで便利になるシーンがあるからです。

たとえば、

  • オブジェクトを複数作りたくないとき
  • 使いたいメソッドを素早く参照したいとき
  • 共通の値やデータをつくりたいとき
  • 初期処理など1回だけ行いたいとき

などです。

詳しくは本記事前半でも解説しています。

クラスとインスタンスはどう違う?
クラスとインスタンスはJavaやC#をはじめとする「オブジェクト指向言語」でよく使われる概念です。
両者は、「設計図と家」に例えるとわかりやすいです。たとえば、
  • クラス = 家の設計図(どんな家を作るかを決めるもの)
  • インスタンス = 設計図から実際に作った家(住める状態になったもの)

といった具合です。

また別の例を挙げるなら、「犬」というクラス(設計図)を作ると、そのクラスから「ポチ」や「シロ」といった具体的な犬(インスタンス)を作ることができる、といったニュアンスです。

Javaのインナークラスとは何ですか?
クラスの中に作られたクラスのことを言います。
たとえばスマホアプリの「画面」クラスの中に、「ボタン」クラスを作るのように、外部クラスに関連する機能をまとめられるのがメリットです。

JAVAを学ぶならどんな学習方法がおすすめ?

結論、初心者からJAVAを学ぶのであれば、ITセミナーやスクールなどに投資する方法がもっともおすすめです。専門知識をもつ講師からわからない部分をしっかりと教えてもらえるだけでなく、自分の力で課題を解くアウトプットの仕組みも盛り込まれているためです。

どこからはじめたらいいかわからない初心者でも取り組める仕組みが充実しているため、挫折の可能性も非常に少ないのがメリットです。

その他の方法としては、

  • 書籍
  • インターネットの記事
  • 動画

などがありますが、自分のペースで進められてお金がかからないというメリットがある一方、挫折率が高いのがデメリットです。セミナーやスクールはお金がかかりますが、リターンを考えると投資効果は高いです。

JAVAのstaticまとめ

Javaのstaticはクラスに直接ひもづく強力な機能で、変数・メソッド・クラスなどに付けることでメモリ節約やコードの略化が可能になります。

本記事で紹介した使い方を参考にstaticを意識して使い、Javaの理解をより深めていきましょう。

最新情報をチェックしよう!