1. ホーム
  2. java

[解決済み] StaticメソッドとInstanceメソッドの違い

2022-03-03 13:08:40

質問

教科書に載っている文章を読み返してみたのですが、何を言っているのかよくわかりません。基本的に、静的メソッドやクラスメソッドはstaticという修飾語を含むと書いてあるのですが。しかし、私はそれが何を意味するのかよく分からないのです。

どなたか、スタティックメソッドやクラスメソッドが何なのか、本当にわかりやすく説明していただけませんか?

また、インスタンスメソッドとは何か、簡単な説明をお願いします。

教科書に載っているのはこんな感じです。

static修飾子の有無は、実用上重要な意味を持ちます。パブリッククラスのメソッドは、Javaがそのメソッドが属するクラスの定義を処理すると同時に呼び出され、実行される可能性があります。しかし、インスタンスメソッドの場合はそうではありません。パブリックインスタンスメソッドを呼び出して実行するには、そのメソッドが属するクラスのインスタンスを生成する必要があります。パブリッククラスメソッドを使うには、そのクラスがあればいいのです。一方、パブリックインスタンスメソッドを使用するためには、そのクラスのインスタンスが必要です。

静的メソッドを他のメソッドの定義内で呼び出す方法は、その2つのメソッドが同じクラスに属しているかどうかによって異なります。上の例では、factial と main はどちらも MainClass クラスのメソッドです。そのため、main の定義内で factorial を呼び出すと、単にメソッド名 "factorial" が参照されるだけです。

どのように解決するのか?

Javaでは、クラスを記述し、そのクラスはインスタンス化されるというのが基本的なパラダイムである。インスタンス化されたオブジェクト(クラスのインスタンス)には、その動作に影響を与える属性(メンバ変数)が関連付けられており、インスタンスのメソッドが実行されると、これらの変数が参照されます。

しかし、ある型のオブジェクトはすべて、メンバー変数にまったく依存しない振る舞いをする場合があります。これらのメソッドは、静的にするのが最適です。静的であれば、そのメソッドを実行するためにクラスのインスタンスは必要ありません。

静的メソッドを実行するには、このようにします。

MyClass.staticMethod();  // Simply refers to the class's static code

しかし、非静的メソッドを実行するには、こうする必要があります。

MyClass obj = new MyClass();  //Create an instance
obj.nonstaticMethod();  // Refer to the instance's class's code

より深いレベルでは、コンパイラはクラスをまとめるときに、メソッドへのポインタを集めてクラスに付けます。それらのメソッドが実行されると、ポインターをたどって、一番奥のコードを実行する。クラスをインスタンス化した場合、生成されたオブジェクトには "仮想メソッド表" へのポインタが含まれ、これは継承階層の中でその特定のクラスに対して呼び出すべきメソッドを指し示すものです。しかし、メソッドが静的であれば、quot;仮想メソッドテーブル"は不要で、そのメソッドの呼び出しはすべてメモリ上の全く同じ場所に行き、全く同じコードを実行する。そのため、高性能なシステムでは、インスタンス変数に依存しないのであれば、静的メソッドを使用したほうがよいでしょう。