[解決済み] StaticメソッドとInstanceメソッドの違い
質問
教科書に載っている文章を読み返してみたのですが、何を言っているのかよくわかりません。基本的に、静的メソッドやクラスメソッドは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;仮想メソッドテーブル"は不要で、そのメソッドの呼び出しはすべてメモリ上の全く同じ場所に行き、全く同じコードを実行する。そのため、高性能なシステムでは、インスタンス変数に依存しないのであれば、静的メソッドを使用したほうがよいでしょう。
関連
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonの静的メソッド?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み】静的なMapを初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] Javaにおけるシンボリック参照
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません