Java静的メソッドが非静的メソッドを呼び出せないのはなぜですか
前書き
非静的メソッドを静的メソッドで呼び出すことはできないことは誰もが知っています。正確には、非静的メソッドを直接呼び出すことはできません。ただし、オブジェクトの参照を静的メソッドに渡してから、オブジェクトの非静的メソッドを呼び出すことができます。
実際、この事実の適用は非常に頻繁であるため、注意を払う必要はありません。メイン関数(静的メソッド)では、特定のクラスのインスタンスを作成し、その参照変数を使用して非静的メソッドを呼び出すことがよくあります。
class Test2{
public void method2(){
System.out.println("HelloWorld2");
}
}
class test{
public void method0(){
System.out.println("HelloWorld0");
}
public static void method1(){
System.out.println("HelloWorld1");
}
public static void main(String args[]){
new test().method0();
method1();
new Test2().method2();
}
}
打印结果:
HelloWorld0
HelloWorld1
HelloWorld2
Javaの静的メソッドが非静的メソッドを呼び出せないのはなぜですか?
これは、Javaのメモリメカニズムから分析する必要があります。まず、オブジェクトを新規作成するとき、最初にヒープ内のオブジェクトのメモリスペースを開くのではなく、最初にクラスで静的メソッド(静的変更を伴う静的関数)を使用します。コードはメソッド領域と呼ばれる場所にロードされ、オブジェクトがヒープメモリに作成されます。したがって、静的メソッドは、クラスがロードされるときにロードされます。オブジェクトを新規作成すると、そのオブジェクトはヒープメモリに存在します。thisキーワードは通常、オブジェクトを参照しますが、新しいオブジェクトがない場合は、クラス名を使用してクラスの静的メソッドを呼び出すことができます。
プログラムは最終的にメモリ内で実行され、変数はメモリ内の場所を占有している場合にのみアクセスできます。
1.クラスの静的メンバー(静的およびメソッド)はクラス自体に属し、メモリはクラスのロード時に割り当てられ、クラス名から直接アクセスできます。
2.非静的メンバー(変数とメソッド)はクラスのオブジェクトに属しているため、メモリはクラスのオブジェクトが作成されたとき(インスタンスが作成されたとき)にのみ割り当てられ、クラスのオブジェクトを介してアクセスされます。
クラスの静的メンバーから非静的メンバーにアクセスするときにエラーが発生する理由は、クラスの非静的メンバーが存在しないときに静的メンバーがすでに存在しているためです。もちろん、メモリの非静的メンバーにアクセスするとエラーが発生します。
静的メソッドが非静的メソッドにアクセスできる場合:まず、静的メソッドは、オブジェクトを新規作成するときに、最初に静的メソッドをクラスファイルと一緒にヒープ内のメソッド領域に配置することです。そうして初めて、オブジェクトがヒープ内に作成されます。つまり、静的メソッドはクラスにすでに存在し、非静的メソッドはまだ作成されていません。静的メソッドによって呼び出された非静的メソッドが作成されていない場合、エラーが報告されます。
JVMは間違いなくこのリスクを冒さず、存在しない可能性のあるメソッドを呼び出すことができるため、将来の不要なトラブルを避けるために、呼び出すときにエラーを報告するだけです。
** staticキーワードの変更されたメンバー変数であるmemberメソッドは、オブジェクトとは何の関係もありません。
静的変更の内容は、クラスのロードとともにロードされ、1回だけロードされます。
固定メモリ領域(静的領域)に格納されるため、クラス名で直接呼び出すことができます。
オブジェクトよりも優先されるため、すべてのオブジェクトで共有できます。
静的は、メンバー変数とメンバーメソッドを変更するために使用できます。変更されたメンバーは
、オブジェクトだけでなく、クラスに属します。つまり、クラスに属しているため、オブジェクトを作成せずに呼び出すことができますが、クラス名を使用して直接呼び出すことができます。
総括する:
まず、静的メンバーはクラスのロード時に初期化され、JVMのCLASSLOADERがロードされ、ロードが初めて使用されます。非静的メンバーは、オブジェクトの作成時、つまり新しい操作の実行時に初期化されます。
順序が最初にロードされます。、次に、ロード時に静的メンバーを初期化します。このとき、ロードする前に非静的メンバーを使用しないでください。非静的メンバーは、クラスのロード後にnew演算子を使用してオブジェクトを作成するときに初期化されます。 staticはメモリスペースを割り当てているので、アクセスできます。
簡単に言うと、静的メンバーはクラスに属し、オブジェクトを生成せずに存在します。オブジェクトを生成するには非静的メンバーを生成する必要があるため、静的メンバーは非静的メンバーに直接アクセスできません。
静的特性について話しましょう:
1.クラスのロード時にロードします
つまり、静的はクラスの消失とともに消失し、静的ライフサイクルが最も長いことを示します
2.オブジェクトの存在を優先します
明確にするために:静的は最初に存在し、次に存在するオブジェクトです
3.すべてのオブジェクトで共有
4.クラス名で直接呼び出すことができます
インスタンス変数とクラス変数の違い
1.保管場所
クラス変数は、クラスがロードされるときにメソッド領域に存在し、インスタンス変数は、オブジェクトのオブジェクトが作成されるときにヒープメモリに存在します。
2.ライフサイクル
クラス変数のライフサイクルは最も長く、「クラス」がロードされるとロードされ、クラスが消えると消え、「オブジェクト」が消えるとインスタンス変数が消えます。
静的使用に関する注意:
1.静的メソッドは静的メンバー(メンバー変数とメンバーメソッドを含む)にのみアクセスできます
非静的メソッドは、静的または非静的にアクセスできます
2.thisキーワードとsuperキーワードは静的メソッドでは定義できません
staticはオブジェクトよりも優先されるため、thisキーワードとsuperキーワードはstaticメソッドに表示できません。
3.主な機能は静的です。
静的な長所と短所
長所:オブジェクトの共有データは個別のスペースに保存されるため、スペースを節約できます。各オブジェクトにコピーを保存する必要はなく、クラス名で直接呼び出すことができます。
短所:ライフサイクルが長すぎ、アクセスが制限されます(静的のみ)
継続的に更新しています...
記事参照学習アドレス:https://blog.csdn.net/jiayi_yao/article/details/51346378
記事参照学習アドレス:https://blog.csdn.net/qq_35499112/article/details/84886871