Javaのstaticは各要素の動きを一変させる強力な修飾子です。それほど意識せずに使っている方も多いですが、本質を理解するとメモリ管理やアクセス簡略化など数々の恩恵を受けられます。
本記事ではJavaにおけるstaticが活躍する具体的なシーンから、staticクラス・メソッド・変数などの使い方まで詳しく解説します。加えて注意点やよくある疑問にも触れているので、ぜひ参考にしてください。
JAVAのstatic修飾子とは何?
Javaのstatic修飾子は、変数やメソッドを「クラスそのもの」に結びつけるためのキーワードのことです。
通常、クラスからオブジェクトをたくさん作ると、そのオブジェクトごとに変数やメソッドが用意されます。しかしstaticを付けると、オブジェクトとは関係なくクラスに直接ひとつだけそれらが存在するようになります。
つまり同じ情報を多くのオブジェクトで共有できるほか、使いたいメソッドをすぐに呼び出せるようになるといったメリットがあります。また、staticメソッドはオブジェクトを作らなくても呼び出せるので、ちょっとした計算やメッセージの表示などに使うと、コードが簡略化できるのも利点です。
ただ記事後半でも解説しますが、staticメソッドの中では「this」が使えないため、オブジェクト特有の変数やメソッド(非staticなもの)にはアクセスできません。これは「staticメソッドはクラスと結びついていて、オブジェクトの情報を持っていない」という仕組みによるものです。
staticは便利な機能ではあるものの使える範囲に限りがあるので、状況に合わせて正しく使う必要があります。なお、staticの概要を一覧表にまとめると、以下のようになります。
役割 | クラス直下で共有されるメソッドや変数を定義する |
利用シーン |
など |
メリット |
|
デメリット/注意 |
|
そもそもstaticとは?
そもそも「static」は英語で「静的な」「変わらない」といった意味をもつ言葉です。何かが固定されて動かない状態を指します。
Javaにおけるstaticも、この意味に近い使われ方をしています。通常、クラスの各要素はオブジェクトごとに作られますが、staticを付けるとそれらはクラスに属し、オブジェクトを作らなくても使えるようになり、つまり、「static=クラスに直接ひもづく」ことを意味しています。
JAVAのstatic修飾子が使われる主なシーン
JAVAのstatic修飾子が使われる主なシーンとしては、以下が挙げられます。
変数 | すべてのオブジェクトで共有の値やデータをつくりたいとき |
メソッド | オブジェクトを作らなくても使えるメソッドを定義したいとき |
ブロック | 初めてクラスが使われたとき、処理を一回だけ実行したいとき(初期設定など) |
一般的にJavaでは、クラスの変数はオブジェクトそれぞれに作られますが、staticの利用によって全オブジェクトが共通の値やデータを所持するようになります。
また通常では不可能ですが、staticを使えば「オブジェクトなしのメソッド」が使えるようになったり、初期設定時に1回限りの処理を行うときにも重宝します。
JAVAのstaticの使い方
ここではJavaのstaticの使い方として、以下のパターン別にくわしく紹介していきます。
- static classで使う場合
- staticメソッドとして使う場合
- static変数として使う場合
- static finalで定数にする場合
- static importで簡略化する場合
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();
}
}
実行結果:
上記は「Inner」クラスに「showMessage()」を定義し、「Main」クラスで「Outer.Inner」を直接呼び出し実行しています。
「Outer.Inner obj = new Outer.Inner();」の部分で、外部クラスなしでオブジェクトを作っています。ここは通常の内部クラス(staticなし)だと、外部のオブジェクトが必要になります。
staticメソッドとして使う場合
こちらはインスタンスを作らずに直接呼び出せるメソッドのことをいいます。
通常はオブジェクトを作らないと使えませんが、staticを付けるとクラス名から直接アクセスできます。
class Utility {
static void greet() {
System.out.println(“こんにちは!これはstaticメソッドです。”);
}
}
public class Main {
public static void main(String[] args) {
// クラス名から直接メソッドを呼び出し
Utility.greet();
}
}
実行結果:
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);
}
}
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; // エラー(値を変更できない)
}
}
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と同じ意味
}
}
実行結果:
円周率: 3.141592653589793
なおJavaには、エラーを適切に処理する重要な例外処理「try-catch」というものが存在します。以下の記事で詳しく紹介していますので、気になる方はぜひご一読ください。
JAVAのstaticを使用する際の注意点
ここでは、JAVAのstaticを使用する際の注意点として、以下の2つをご紹介します。
- thisへのアクセスは静的メソッドからは行えない
- 非staticメソッドや変数を使った処理はできない
thisへのアクセスは静的メソッドからは行えない
thisへのアクセスは、静的メソッドからは行えない点に注意が必要です。
なぜなら「this」はオブジェクトそのものを指すワードなのに対し、staticメソッドはオブジェクトなしで動くからです。
非staticメソッドや変数を使った処理はできない
staticメソッド内では、オブジェクトに依存する非staticな変数やメソッドを直接使うことができません。
もし使いたい場合は、オブジェクトを作ってから利用する必要があり、これを守らないとエラーとなってしまうので気をつけましょう。
なお、Javaにはエラーや警告を減らすための機能「アノテーション」が存在します。興味のある方は、ぜひ以下の記事もご覧ください。
JAVAのstaticに関するよくある質問
最後に、Javaのstaticにまつわるよくある質問に解答していきます。
つけることで便利になるシーンがあるからです。
たとえば、
- オブジェクトを複数作りたくないとき
- 使いたいメソッドを素早く参照したいとき
- 共通の値やデータをつくりたいとき
- 初期処理など1回だけ行いたいとき
などです。
詳しくは本記事前半でも解説しています。
- クラス = 家の設計図(どんな家を作るかを決めるもの)
- インスタンス = 設計図から実際に作った家(住める状態になったもの)
といった具合です。
また別の例を挙げるなら、「犬」というクラス(設計図)を作ると、そのクラスから「ポチ」や「シロ」といった具体的な犬(インスタンス)を作ることができる、といったニュアンスです。
JAVAを学ぶならどんな学習方法がおすすめ?
結論、初心者からJAVAを学ぶのであれば、ITセミナーやスクールなどに投資する方法がもっともおすすめです。専門知識をもつ講師からわからない部分をしっかりと教えてもらえるだけでなく、自分の力で課題を解くアウトプットの仕組みも盛り込まれているためです。
どこからはじめたらいいかわからない初心者でも取り組める仕組みが充実しているため、挫折の可能性も非常に少ないのがメリットです。
その他の方法としては、
- 書籍
- インターネットの記事
- 動画
などがありますが、自分のペースで進められてお金がかからないというメリットがある一方、挫折率が高いのがデメリットです。セミナーやスクールはお金がかかりますが、リターンを考えると投資効果は高いです。
JAVAのstaticまとめ
Javaのstaticはクラスに直接ひもづく強力な機能で、変数・メソッド・クラスなどに付けることでメモリ節約やコードの略化が可能になります。
本記事で紹介した使い方を参考にstaticを意識して使い、Javaの理解をより深めていきましょう。
