.net column

.NET開発者のためのブログメディア

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

2020年05月20日

SE
staticメソッドとインスタンスメソッドの違いには、どのようなことがあるのでしょうか?

PM
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メソッドを量産することで、本来使用するべきではないメソッドの場面でもコンパイルエラーにならず通ってしまう可能性があります。

SE
staticメソッドとインスタンスメソッドの違いがわかれば、しっかりと使い分けできそうですね。

PM
そうですね。メソッド(処理)共有や参照したいときに使ってみましょう!

staticメソッドとインスタンスメソッドの違いを理解して活用しよう

皆さんがjavaのプログラミングで何気なく使っていた、staticメソッドとインスタンスメソッドの違いはお分かりいただけたでしょうか。staticメソッドはインスタンスに依存しない、クラスが直接もつメソッドなので、メソッド(処理)共有や参照したい場合にぜひ活用してみましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)