なぜ内部の静的な方法で非静的メソッドや変数を呼び出すことはできませんか?

オリジナルリンク: https://blog.csdn.net/zhouwubin123/article/details/6623308#commentBox

ヒント:

  • 静的:静的
    用途:修飾子は、メンバー(メンバー変数とメンバ関数)を変更するため
    の部材がまだオブジェクトが呼び出すことができることを除いて、コールのそれ以上に変更されただけでなく、直接クラス名を呼び出すことができる場合形式:静的メンバクラス名

  • 静的な特徴:

    • 負荷とクラスの負荷で、それは最長のライフサイクルの静的な記述、静的クラスが消滅して消えてしまうと言うことであり、
    • 明確にする、オブジェクトの存在に優先します:静的なオブジェクトが存在した後に存在することです
    • これは、すべてのオブジェクトによって共有されています
    • 直接クラス名などを呼び出すことができます
  • インスタンス変数とクラス変数の違い

    • 保管場所の処理領域内に存在するクラス変数とクラスローディング、オブジェクトのインスタンス変数の確立とは、ヒープメモリに存在します
    • ライフサイクル:クラスの消失消えると「クラス」負荷と負荷とクラス変数最長のライフサイクル、、、「オブジェクト」とインスタンス変数が消えます
  • 静的の使用に注意してください。

    • 静的メソッドは、(メンバ変数とメンバ・メソッドを含む)のみの静的メンバにアクセスすることができ、また、非静的にアクセスすることができ、静的にアクセスすることができ、非静的メソッド
    • 静的メソッドは、この、スーパーキーワードを定義することはできません。オブジェクトの上に静的優先度が存在するため、その静的メソッドは、この、superキーワードを表示することはできません
    • 主な機能は、静的なものです。
  • 静的な長所と短所

    • リー:共有データオブジェクトは、スペースを節約、別途スペースが保存されている、いないオブジェクトは、両方のコピーを格納する必要がなく、
      直接クラス名で呼び出すことができます
    • 短所:長いライフサイクル、訪問は制限(アクセスのみ静的)が表示されます

だから、来ます:

静荷重は、限りがあるとしてロードされたクラスとクラスで、その後、既存のオブジェクトへの静的優先度ながら、あなたは非静的なものにアクセスしたい、それは非静的メンバ(を含む静的ありますされているので変数やメソッド)、非静的なものは、あなたがそれにアクセスする方法は存在しませんでしたか?

上記の結論の場合を説明するために:

私たちは、次の分析を行う理由:

最終的なプログラムがメモリ内で実行されるメモリではなくメモリ変数内の場所にアクセスすることができないとき、変数にのみアクセスすること。静的メンバー(変数とメソッド)は、クラスがロードされたときにメモリを割り当てます、クラス自体のクラスに属し、それはクラス名を介して直接アクセスすることができます。

オブジェクト・クラスによってアクセスする、オブジェクト・クラス、(インスタンス)に(クラスのインスタンスを作成する)メモリを割り当てるときに、オブジェクト・クラスに属する非静的メンバ(変数とメソッド)は、それだけ生成します。

public class StaticDemo {
	static int x;
	static void fun() {
		System.out.println("this is fun()");
	}
 
	public static void main(String[] args) {
		StaticDemo.x = 5;		//	可以用类名直接访问静态成员
		fun();				//	在类体内也可以直接访问
	}
}

クラスがメモリにロードされるときに、静的メンバが静的なメンバではないのではなく、割り当てられますので。このように、アクセスするためのクラスの静的メンバに非静的メンバは、間違っているので、存在しないクラスの非静的メンバは、クラスの静的メンバは存在していたとき、どのようなコースを存在していないメモリへのアクセスエラーが発生しました。

そして、何時にクラスがそれをロードされていますか?(例えばStringクラスなど)コアクラスは(mainメソッドを開始する前に)JVMが使用を動的にロードすることができます前に、他のクラス(オブジェクトのインスタンス化は、前などの静的メソッド、アクセス静的フィールドを呼び出す)、起動時にロードされます。

なお、フロントサブクラスがロードされ、そのスーパークラスのすべてが親から子への順序に従って一つずつロードされます。

例としては、次のとおりです:

class A1 {
	public static int a = 5;
}
 
class B1 extends A1 {
	public static int a = 8;
 
	void print() {
		System.out.println(super.a);
		System.out.println(a);
	}
}
// 测试类
public class TestStatic {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("b.a="+B1.a);
        System.out.println("b.a="+A1.a);
        new B1().print();
	}
}

最终的运行结果如下:
b.a=8
b.a=5
5
8

コード分​​析:

あなたは、DOS環境で入力するとします。java TestStaticをするとき

  • 最初の負荷静的変数静的変数の場合、(1)JVMは、まずJVMがTestStaticクラスが直接メインメソッドを実行しない、静的なフィールドが存在するになります、TestStaticクラスをロードします

  • (2)主な印刷がB1.aの方法である場合には、JVMは、クラスB1を探します、B1を見つけ、見つけB1の親はA1で、その後、A1が優先的にロードされ、父;

  • A1をロードする場合(3)、それは静的のメンバー(静的変数、静的メソッド)A1で、見つかった静的変数(静的int型A = 5)に示すように、第1の負荷をスキャンし、すべての静的フィールドの読み込みが終了したら、それはもはやロードされているので、完了するためにクラスをロードしません。A1は、すでにここにクラスをロード、その背後にロードされません、それだけでバイトコードの情報をロードする方法にゾーンを使用します。

  • (4)の父はサブクラスB1ターンをロードする前にロードされ、同じ第1のB1の存在下での静的フィールドをスキャン、B1はまた、この時点でロードされるロード、静的変数(静的int型A = 8)が見つかりましたA;

最初のprint文は終了し、この時点で実行されます。

print文の順番で通過し、このオブジェクト(新しいB1()。プリント( ))、 実行文は、動的に発生することができ、結合、次いで()メソッドを印刷するために、オブジェクトB1の代表があるでしょう、印刷()メソッドのSystem.out.println(a)は、実際のSystem.out.println(this.a)、プリント8。super.a親クラスを印刷することであるので、結果は5です。
プログラム全体の終了を実行するための本、main()メソッド。

スプレッド

ここでは、クラスのロード順で見ることができますか?クラスローディング機構がどのような状況の下でトリガされましたか?JVMローディング機構は似ているのですか?やその他の問題

参考:
静的メソッドは非静的変数やメソッドを呼び出すことはできませんなぜ
?なぜ静的メソッド、または変数内部から非静的メソッドを呼び出すことはできません
なぜ静的メソッドから非静的メソッドや変数を呼び出すことはできません(復刻版)?

おすすめ

転載: blog.csdn.net/weixin_43719015/article/details/102718905