Javaの静的メソッドとインスタンスメソッド
インスタンスメソッド
インスタンスメソッドは、呼び出される前にクラスのオブジェクトを作成する必要があるメソッドです。インスタンスメソッドを呼び出すには、クラスメソッドを定義したクラスのオブジェクトを作成する必要があります。
public void geek(文字列名)
{
//実行するコード….
}
//戻り値の型は、int、float、またはユーザー定義のデータ型です。
メモリの割り当て: これらのメソッド自体はヒープの永続生成スペースに格納されますが、パラメーター(それらに渡される引数)とそのローカル変数および返される値はスタックに割り当てられます。それらは、それらが存在する同じクラス内で、または同じパッケージまたは他のパッケージで定義された異なるクラスから呼び出すことができ、目的のインスタンスメソッドに提供されるアクセスタイプに依存します。
重要ポイント
・インスタンスメソッドは、クラスではなくクラスのオブジェクトに属します。つまり、クラスのオブジェクトを作成した後に呼び出すことができます。
・クラスから作成された個々のオブジェクトには、そのクラスのインスタンスメソッドの独自のコピーがあります。
・インスタンスメソッドは、仮想メソッドを使用していても、インスタンスごとに保存されません。それらは単一のメモリロケーションに格納され、呼び出し時にthisポインタが渡されるため、どのオブジェクトに属しているかを「知る」だけです。
・これらは実行時に動的バインディングを使用して解決されるため、オーバーライドできます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//インスタンスメソッドへのアクセスを説明する例。 import java.io.*; class Foo{ String name = ""; //同じクラス内で呼び出されるインスタンスメソッドまたは //同じパッケージで定義された別のクラスから //または別のパッケージ。 public void geek(String name){ this.name = name; } } class GFG { public static void main (String[] args) { //クラスのインスタンスを作成します。 Foo ob = new Foo(); //クラス 'Foo'のインスタンスメソッドを呼び出します。 ob.geek("GeeksforGeeks"); System.out.println(ob.name); } } |
出力結果
GeeksforGeeks
静的メソッド
静的メソッドは、クラスのオブジェクトを作成せずに呼び出すことができるJavaのメソッドです。それらは、クラス名自体またはそのクラスのオブジェクトへの参照によって参照されます。
1 2 3 4 5 6 7 |
public static void geek(String name) { //実行するコード.... } //宣言に静的修飾子が必要です。 //戻り値の型は、int、float、String、またはユーザー定義のデータ型です。 |
メモリ割り当てそれらは、そのクラスのオブジェクトではなく、それらが存在するクラスに関連付けられているため、ヒープの永続生成スペースに格納されます。しかし、それらのローカル変数とそれらに渡された引数はスタックに格納されます。それらはクラスに属しているため、クラスのオブジェクトを作成せずに呼び出すことができます。
重要なポイント
静的メソッドは、それらが存在するクラスに関連付けられています。つまり、クラスのインスタンス(ClassName.methodName(args))を作成しなくても呼び出すことができます。それらは、同じクラスから作成されたすべてのオブジェクト間で共有されることを目的として設計されています。
静的メソッドはオーバーライドできません。ただし、コンパイル時にコンパイラーによって静的バインディングを使用して解決されるため、オーバーロードされる可能性があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//クラスの静的メソッドへのアクセスを説明する例。 import java.io.*; class Geek{ public static String geekName = ""; public static void geek(String name){ geekName = name; } } class GFG { public static void main (String[] args) { //静的メソッドgeek()にアクセスし、 //クラス名自体によるフィールド。 Geek.geek("vaibhav"); System.out.println(Geek.geekName); //オブジェクトの参照を使用して静的メソッドgeek()にアクセスします。 Geek obj = new Geek(); obj.geek("mohit"); System.out.println(obj.geekName); } } |
出力結果
Vaibhav
モヒト
注:クラスで定義された静的変数とその値(プリミティブまたは参照)は、メモリのPermGenスペースに格納されます。
静的変数がオブジェクトを参照している場合はどうなりますか?
static int i = 1;
静的オブジェクトobj = new Object();
最初の行では、値1がPermGenセクションに格納されます。2行目では、参照objはPermGenセクションに格納され、参照するオブジェクトはヒープセクションに格納されます。
静的メソッドを使用するのはいつですか?
同じクラスのすべてのインスタンスで共有できるコードがある場合、コードのその部分を静的メソッドに配置します。
それらは基本的にクラスの静的フィールドにアクセスするために使用されます。
インスタンスメソッドと静的メソッド
・インスタンスメソッドは、インスタンスメソッドとインスタンス変数に直接アクセスできます。
・インスタンスメソッドは、静的変数と静的メソッドに直接アクセスできます。
・静的メソッドは、静的変数と静的メソッドに直接アクセスできます。
・静的メソッドはインスタンスメソッドとインスタンス変数に直接アクセスできません。オブジェクトへの参照を使用する必要があります。また、「this」のインスタンスがないため、静的メソッドはこのキーワードを使用できません。
Ryotin
現役フリーランスエンジニアです。使ってるエージェントはフライテック!得意言語はJava。月収は75万円。SESのフリーランスではこれ以上稼ぐのは厳しそう...とはいってもサラリーマンの時より倍の収入だから家族も喜んでるけどね!