この記事では、Java の静的メソッドとインスタンス メソッドについて学びます。
Javaインスタンスメソッド
インスタンス メソッドは、呼び出す前にそのクラスのオブジェクトを作成する必要があるメソッドです。インスタンス メソッドを呼び出すには、メソッドが定義されているクラスのオブジェクトを作成する必要があります。
public void geek(String name) { // code to be executed.... } // Return type can be int, float String or user defined data type.>
インスタンスメソッドのメモリ割り当て
これらのメソッド自体はヒープの永続生成スペースに保存されます (Java 7 までのみ有効で、Java 8 以降では効率が向上してメタスペースに置き換えられました) が、パラメータ (メソッドに渡される引数) とそのローカル変数、および値は保存されません。返される値はスタックに割り当てられます。これらは、それらが存在する同じクラス内で呼び出すことも、同じパッケージまたは他のパッケージで定義されている異なるクラスから呼び出すこともできます。 アクセスタイプ 目的のインスタンス メソッドに提供されます。
重要な点:
- インスタンス メソッドは、クラスではなく、クラスのオブジェクトに属します。つまり、クラスのオブジェクトを作成した後に呼び出すことができます。
- インスタンス メソッドは、仮想メソッドであっても、インスタンスごとに保存されません。これらは 1 つのメモリの場所に保存され、呼び出すときにこのポインタが渡されるため、どのオブジェクトに属しているかだけがわかります。
- これらは次を使用して解決されるため、オーバーライドできます。 動的バインディング 実行時。
以下はインスタンス メソッドにアクセスする実装です。
ジャワ
// Example to illustrate accessing the instance method .> import> java.io.*;> class> Foo {> > String name => ''> ;> > // Instance method to be called within the> > // same class or from a another class defined> > // in the same package or in different package.> > public> void> geek(String name) {> this> .name = name; }> }> class> GFG {> > public> static> void> main(String[] args)> > {> > // create an instance of the class.> > Foo ob => new> Foo();> > // calling an instance method in the class 'Foo'.> > ob.geek(> 'techcodeview.com'> );> > System.out.println(ob.name);> > }> }> |
>
>出力
techcodeview.com>
Java 静的メソッド
静的メソッドは、クラスのオブジェクトを作成せずに呼び出すことができる Java のメソッドです。それらは、 クラス名そのもの またはそのクラスのオブジェクトへの参照。
git チェックアウト
public static void geek(String name) { // code to be executed.... } // Must have static modifier in their declaration. // Return type can be int, float, String or user defined data type.>
静的メソッドのメモリ割り当て
これらは、そのクラスのオブジェクトではなく、存在するクラスに関連付けられているため、ヒープの永続生成スペースに格納されます。ただし、それらのローカル変数とそれらに渡された引数はスタックに格納されます。これらはクラスに属しているため、クラスのオブジェクトを作成せずに呼び出すことができます。
重要な点:
- 静的メソッドは、それが存在するクラスに関連付けられます。つまり、クラスのインスタンスを作成せずに呼び出されます。 クラス名.メソッド名(引数) 。
- これらは、同じクラスから作成されたすべてのオブジェクト間で共有されることを目的として設計されています。
- 静的メソッドは次を使用して解決されるため、オーバーライドできません。 静的バインディング コンパイル時にコンパイラによって実行されます。ただし、同じ名前のメソッドを宣言することはできます。 静的 両者に スーパークラス そして サブクラス 、と呼ばれますが、 メソッドの隠蔽 派生クラスのメソッドは基本クラスのメソッドを非表示にするためです。
以下は、静的メソッドへのアクセスの図です。
ジャワ
// Example to illustrate Accessing> // the Static method(s) of the class.> 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)> > {> > // Accessing the static method geek()> > // and field by class name itself.> > Geek.geek(> 'vaibhav'> );> > System.out.println(Geek.geekName);> > // Accessing the static method geek()> > // by using Object's reference.> > Geek obj => new> Geek();> > obj.geek(> 'mohit'> );> > System.out.println(obj.geekName);> > }> }> |
>
>出力
vaibhav mohit>
注記:
クラスで定義された静的変数とその値 (プリミティブまたは参照) は、次の場所に保存されます。 パーマジェン 記憶の空間。
よくある質問
1. 静的変数がオブジェクトを参照している場合はどうなりますか?
static int i = 1; static Object obj = new Object();>最初の行では、値 1 が PermGen セクションに格納されます。 2 行目では、参照 obj は PermGen セクションに保存され、それが参照するオブジェクトはヒープ セクションに保存されます。
2. 静的メソッドをいつ使用するか?
- 同じクラスのすべてのインスタンス間で共有できるコードがある場合は、コードのその部分を静的メソッドに置きます。
- これらは基本的に、クラスの静的フィールドにアクセスするために使用されます。
3. インスタンスメソッドとスタティックメソッドの違い
- インスタンス メソッドは、インスタンス メソッドとインスタンス変数に直接アクセスできます。
- インスタンス メソッドは、静的変数と静的メソッドに直接アクセスできます。
- 静的メソッドは、静的変数と静的メソッドに直接アクセスできます。
- 静的メソッドはインスタンス メソッドやインスタンス変数に直接アクセスできません。オブジェクトへの参照を使用する必要があります。静的メソッドは使用できません これ 「this」が参照するインスタンスがないため、キーワードを使用します。