staticメソッドとインスタンスメソッドの違いと使い方を解説

- システム
エンジニア - staticメソッドとインスタンスメソッドの違いには、どのようなことがあるのでしょうか?
- プロジェクト
マネージャー - staticメソッドとインスタンスメソッドは違う働きをします。詳しく解説していきましょう。
javaにおけるクラス・メソッド・インスタンス
javaのメソッドには、2種類のメソッドが存在します。「staticメソッド」と「インスタンスメソッド」です。
staticメソッドはメソッドに”static”という修飾子を付与したものであり、これは”static”を付与していない非staticメソッド、すなわちインスタンスメソッドとは違う働きをします。
今回は、この2つのメソッドの違いから、staticメソッドの特徴や使い方について学んでいきましょう。
staticメソッドの説明に入る前に、まずはjavaにおけるクラス・メソッド・インスタンスの3つについておさえておきましょう。
クラスとは、プログラムの設計図のことです。車の設計図で例えてみましょう。この設計図をより具体的にしたものがインスタンスです。インスタンスとは実体を意味します。
車の設計図をもとに出来上がったトラックやタクシー自体が、インスタンスというイメージです。
メソッドは、クラス(インスタンス)の中にある処理です。
車の設計図(クラス)をもとに、トラックやタクシー(インスタンス)を生成しますが、これに振る舞いを持たせるのがメソッドの役目です。
たとえば「トラック」「タクシー」といった名前や、車の色などです。つまり、メソッドには必ず何かしらのクラス(インスタンス)に属していることになります。
staticメソッドとは?
メソッド(振る舞い)は、クラスに属しているのか、クラスから派生したインスタンスに属しているのかで全く別のものになります。
「staticメソッド」は、クラスに属しているメソッドです。反対に、インスタンスに属しているメソッドを非staticメソッド、通称「インスタンスメソッド」といいます。
javaのstaticメソッドの設定方法
メソッドに”static”修飾子を付与することでstaticメソッドになります。
この例では、staticMethodメソッドがstaticメソッドであり、instanceMethodメソッドはインスタンスメソッドです。
class Sample{
public static void main(String[]args){
}
static void staticMethod(){ //staticメソッド
}
void instanceMethod(){ //インスタンスメソッド
}
}
javaのmainメソッドはstaticメソッドである
javaでプログラミングをするときに、決まって最初に書くコードがあります。
class クラス名{
public static void main(String[]args){
}
}
皆さんも、javaのプログラミング学習を始めるときに、このコードを何度も書いたのではないでしょうか。
このコードにある”public static void main(String[]args){}”は、javaのプログラムで最初に実行されるメソッドであり、mainメソッドといいます。そしてこのメソッドは”static”が付与されているため、staticメソッドです。
staticメソッドの具体例
staticメソッドは、さまざまな場所で繰り返し同じ処理を呼びたいときに活用することができます。ではどういうときにstaticメソッドが使えるのか、具体例を見てみましょう。
ここでは、インスタンス(実体)を作り出したときに、そのインスタンスに与えた名前と、現在生成された車のカウントをする処理(staticメソッド)をしています。
Carクラス
class Car{
static int num;
String name;
static void carCount(){ //staticメソッド
num++;
System.out.println(“車の数は” + num + “台です”);
}
void track(){ //インスタンスメソッド
name = “トラック”;
System.out.println(name);
}
void taxi(){ //インスタンスメソッド
name = “タクシー”;
System.out.println(name);
}
}
Mainクラス
public class Main {
public static void main(String[] args) throws Exception {
Car car = new Car();
car.track();
Car.carCount();
car.taxi();
Car.carCount();
}
}
実行結果:
トラック
車の数は1台です
タクシー
車の数は2台です
staticメソッドの呼び出し方は「クラス名.staticメソッド名();」
staticメソッドは、クラスに属しているため、呼び出すときはクラス名をつけて「クラス名.staticメソッド名();」で呼び出せます。
ただし、同じクラス内でstaticメソッドを呼び出したいときは、クラス名をつけずに「staticメソッド名();」のみで呼び出すことが可能です。
staticメソッドの注意点
staticメソッドは繰り返しメソッドを使用したいときに活用できるので便利だと思うかもしれませんが、正しい仕組みを知っていないとコンパイルエラーになったり、想定している動きにならなかったりすることがあります。
また、staticメソッドはあくまでも共有や参照するときに使えるメソッドという性質をもつため、反対にstaticメソッドを使うべきではない場面もあります。
staticメソッドを使用する上での注意点をおさえておきましょう。
staticメソッド内で直接インスタンスメソッドは呼び出せない
javaでは、staticメソッドからstaticメソッドの呼び出しはできますが、staticメソッドからインスタンスメソッドは呼び出すことができません。
次の例では、Mainクラスでstaticメソッドであるmainメソッドから、Carクラスのインスタンスメソッドであるtrackメソッドを呼び出そうとしています。
Mainクラス
class Main{
public static void main(String[]args){
Car.track();
}
}
実行結果:
コンパイルエラー
staticメソッドであるmainメソッドからインスタンスメソッドであるCarクラスのtrackメソッドを呼び出そうとすると、「型Mainの非staticメソッドtrack()をstatic参照することはできません」と、コンパイルエラーになります。
これは、インスタンスメソッドは最初に初期化しないとメモリが確保されないためです。しかし、直接呼び出すことができないだけであって、間接的であれば呼び出すことができます。
Mainクラス
public class Main {
public static void main(String[] args) throws Exception {
Car car = new Car(); //MainクラスでCarクラスのインスタンスをnewで生成している
car.track();
}
}
実行結果:
トラック
このように、javaのMainクラス内でCarクラスをインスタンスとして生成してあげれば、Mainクラス内のstaticメソッドであるmainメソッドからでも、間接的に呼び出せます。
反対に、インスタンスメソッド内でstaticメソッドを呼び出すときは、staticメソッドはインスタンスに依存しているわけではないので、newせずともコンパイルエラーになりません。
javaでは共有・参照しないものは基本的にインスタンスメソッドにする
javaはオブジェクト指向が強いプログラミング言語であり、javaで開発されるプログラムはそれぞれの役割をしっかりと持っているという特徴があります。
そのため、基本的には共有・参照など、プログラミング上どうしてもstaticメソッドにしないといけないもの以外はインスタンスメソッドにしましょう。
安易にstaticメソッドを量産することで、本来使用するべきではないメソッドの場面でもコンパイルエラーにならず通ってしまう可能性があります。
- システム
エンジニア - staticメソッドとインスタンスメソッドの違いがわかれば、しっかりと使い分けできそうですね。
- プロジェクト
マネージャー - そうですね。メソッド(処理)共有や参照したいときに使ってみましょう!
staticメソッドとインスタンスメソッドの違いを理解して活用しよう
皆さんがjavaのプログラミングで何気なく使っていた、staticメソッドとインスタンスメソッドの違いはお分かりいただけたでしょうか。
staticメソッドはインスタンスに依存しない、クラスが直接もつメソッドなので、メソッド(処理)共有や参照したい場合にぜひ活用してみましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

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


Java新着案件New Job
-
設計情報のビューアシステムマイグレーション/東京都品川区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】
月給41万~43万円東京都品川区(大崎駅) -
設計情報のビューアシステムマイグレーション/東京都品川区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】
月給29万~31万円東京都品川区(大崎駅) -
大手製造会社販売物流システム再構築<アプリ設計>/神奈川県茅ヶ崎市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】
月給41万~50万円神奈川県茅ヶ崎市(-駅) -
大手製造会社販売物流システム再構築<アプリ設計>/神奈川県茅ヶ崎市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】
月給29万~34万円神奈川県茅ヶ崎市(-駅) -
医療向けWebアプリケーションのカスタマイズ対応/東京都品川区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】
月給48万~50万円東京都品川区(大崎駅) -
医療向けWebアプリケーションのカスタマイズ対応/東京都品川区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】
月給32万~34万円東京都品川区(大崎駅)