JAvaクラスメソッドとインスタンスメソッド呼び出し関係

5718 ワード

JAvaクラスメソッドとインスタンスメソッド
1.クラスメソッド
静的メソッドとも呼ばれ、static修飾クラス内のメソッドを使用する.
2.インスタンスメソッド
非静的メソッドで、staticで修飾するメソッドはありません.
3.テストケース
public class Test {

    private int a = 5;
    private static int b = 10;

    public static void yiStatic()
    {
//        a = 10;//               
        System.out.println("yiStatic");
    }

    public void yiInstance()
    {
        a = 10;
        b = 5;//             
        System.out.println("yiInstanc");
    }

    public void yiInstance2()
    {
        yiStatic();//              
        yiInstance();//             
        System.out.println("yiInstance2");
    }

    public static void yiStatic2()
    {
        yiStatic();//            
//        yiInstance();//              
        System.out.println("yiStatic2");
    }
}


このようなテストにより,インスタンスメソッド,すなわち非静的メソッドはクラス内の任意の変数とメソッド(静的および非静的を含む)にアクセスでき,静的メソッドでは静的変数と静的メソッドのみにアクセスできることが分かった.その理由を究明すると、jvmレベルからインスタンスメソッドと静的メソッドの違いを理解することができます.
インスタンスメソッド
jvmでクラスのバイトコードファイルをmemoryにロードすると、クラスのすべてのメソッドにエントリアドレス、例えばインスタンスメソッド、すなわち非静的メソッドはすぐに割り当てられず、オブジェクトを作成する場合にのみ、クラスのインスタンスメソッドにアクセスアドレスが割り当てられます.また、クラスの最初のオブジェクトを作成すると、クラスのインスタンスメソッドのエントリアドレスが割り当てられ、その後、このオブジェクトを作成すると、インスタンスメソッドに新しいアドレスを割り当てるのではなく、最初のオブジェクトが作成されたときに割り当てられたインスタンスメソッドのエントリアドレスが共有され、クラスの最後のインスタンスオブジェクトが破棄された場合にのみアドレスが回収されます.
クラスメソッド(静的メソッド)
jvmがクラスのバイトコードファイルをmemoryにロードすると、クラスメソッドにはエントリアドレスが割り当てられるので、クラスメソッドはオブジェクト作成後にアクセスする必要がなく、クラスを介して直接アクセスすることができ、クラスメソッドのエントリアドレス割り当てがインスタンスメソッドよりも早いことが分かるので、上述のプログラムでは、静的メソッドが非静的変数およびインスタンスメソッドにアクセスできない理由:
a.クラスメソッドでは非静的変数とインスタンスメソッドにアクセスできない
非静的メンバー変数はインスタンスメソッドと同様に、オブジェクトの作成時にのみエントリアドレスが割り当てられ、静的メソッドのエントリアドレス割り当てはインスタンスメソッドよりも早いため、非静的メンバー変数とインスタンスメソッドがメモリに割り当てられていないためアクセスできません.
b.クラスメソッドでもsuperとthisキーワードにアクセスできません
明らかに、thisは本クラスのオブジェクトを指し、superは継承時に親クラスを指すオブジェクトであり、静的メソッドではアクセスできないため、両方ともクラスのインスタンスオブジェクトの作成に依存していることがわかります.
c.例示的な方法には上記の制限はない
インスタンスメソッドとクラスメソッドによるメモリの割り当ての前後順は明らかです.
参考文献:https://blog.csdn.net/mhady/article/details/51377579