.NETエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnet.NETナビ
  2. .NETコラム
  3. プログラミング言語
  4. Java
  5. staticメソッドとインスタンスメソッドの違いと使い方を解説

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

  • Java
  • プログラミング言語
公開日時:   更新日時:
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