Javaの静的メソッドと非静的メソッドの違い

angryTom
リリース: 2019-11-12 10:24:38
オリジナル
5843 人が閲覧しました

Javaの静的メソッドと非静的メソッドの違い

java の静的メソッドと非静的メソッドの違い

1. 静的メソッド (静的メソッド)

静的メンバー変数と同様、これらはクラス自体に属します。クラスがロードされるときにメモリにロードされ、自動的に破棄されません。JVM が実行されるまでメモリ内に残ります。閉じられています;

2. 非静的メソッド

インスタンス化メソッドとも呼ばれ、インスタンス オブジェクトに属します。メモリはインスタンス化後に割り当てられ、参照する必要があります。インスタンス オブジェクトが JVM によってリサイクルされると、インスタンス オブジェクトも消えます

静的メソッドとインスタンス メソッドの違い

1ライフ サイクル

静的メソッドのライフ サイクルは、プロセスの作成時に開始され、プロセスの終了時に終了します。したがって、静的メソッドはグローバルであり、プロセス全体を通じて実行されます。

インスタンス メソッドのライフ サイクルは、オブジェクトのインスタンス化から始まり、プロセスの終了まで続きます。インスタンス化されたオブジェクトは、登録解除およびリサイクルされた後に終了します。

したがって、インスタンス メソッドのライフ サイクルは短くなります。これは、インスタンス メソッドで静的メソッドを呼び出すことができない理由でもあります。

2 .メソッドの呼び出し

静的メソッドを呼び出す場合外部的には、「クラス名.メソッド名」メソッドまたは「オブジェクト.メソッド名」メソッドを使用できます。つまり、静的メソッドを呼び出すときです。オブジェクトを作成する必要はありません。

インスタンス メソッドで実行できるのは、 「object.method name メソッド」を使用します。

//-----------hasStaticMethod.java-----------------
public class hasStaticMethod{
//定义一个静态方法
public static void callMe(){
  System.out.println("This is a static method.");
}
}
ログイン後にコピー

次のプログラムでは、2 つの形式を使用して静的メソッドを呼び出します。

//-----------invokeStaticMethod.java-----------------
public class invokeStaticMethod{
  public static void main(String args[]){
  hasStaticMethod.callMe(); //不创建对象,直接调用静态方法 
  hasStaticMethod oa = new hasStaticMethod();  //创建一个对象
  oa.callMe();   //利用对象来调用静态方法
}
}
ログイン後にコピー
3. アクセス制限

静的メソッドがこのクラスのメンバーにアクセスする場合、静的メンバー (つまり、静的変数と静的メソッド) へのアクセスのみが許可されます。インスタンス メンバー変数およびインスタンス メソッドにアクセスします。インスタンス メソッドにはこの制限はありません。

インスタンス メンバー変数はオブジェクトに属しており、静的メソッドの実行時にオブジェクトが存在するとは限りません。同様に、静的メソッドが許可されている場合は、メソッドがインスタンス メンバー メソッドにアクセスする場合、インスタンス メンバー変数に間接的にアクセスできるため、インスタンス メンバー メソッドにはアクセスできません。同じ理由に基づいて、キーワード this

//-----------accessMember.java-----------------
class accessMember{
private static int sa; //定义一个静态成员变量
private int ia; //定义一个实例成员变量
//下面定义一个静态方法
static void statMethod(){
  int i = 0;  //正确,可以有自己的局部变量sa = 10;  
  //正确,静态方法可以使用静态变量
  otherStat(); 
  //正确,可以调用静态方法
  ia = 20;  //错误,不能使用实例变量
  insMethod(); //错误,不能调用实例方法
}
static void otherStat(){} 
//下面定义一个实例方法 
void insMethod(){
  int i = 0;  //正确,可以有自己的局部变量
  sa = 15;  //正确,可以使用静态变量
  ia = 30;  //正确,可以使用实例变量
  statMethod();  //正确,可以调用静态方法
}
}
ログイン後にコピー
4 は使用できません。 4. 実行シーケンス

ClassLoader によってクラスファイルが JVM にロードされると、メソッドの命令はスタックに保存されますが、このときヒープにはデータはありません。エリア。その後、プログラム技術者は命令の実行を開始します。静的メソッドの場合、命令コードは順番に直接実行されます。もちろん、この時点では命令コードは Heapshuju データ領域にアクセスできません。インスタンス メソッド (インスタンス メソッドには、JVM によって与えられる暗黙的な受信パラメータがあります。このパラメータは、スタック内のインスタンス オブジェクトのメモリ アドレスであるため、インスタンス メソッドはヒープ内で独自のデータを見つけることができます。オブジェクトは必ず必要です。呼び出す前にインスタンス化され、ヒープにデータが割り当てられ、スタック内のメモリ ポインタが JVM の暗黙的なパラメータを介してインスタンス メソッドに渡されます。インスタンス化せずに直接呼び出すと、暗黙的なパラメーターに値がないため、エラーが報告されます。 ###

以上がJavaの静的メソッドと非静的メソッドの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート