クラスメソッド、インスタンスメソッド、フィールドの呼び出しを区別


この例では、クラスメソッドとインスタンスメソッド呼び出しの違い、および異なる修飾子の下での属性呼び出しの違いを一例に基づいて説明し、この違いを説明します.
親定義:
public class Parent{
	public static String name = "     ,    ";
	public final int age = 40;
	public String birth = "    ,  ";
	public static void sayHello(){
		System.out.println("      ,Hello Parent~");
	}
	public void sayBye(){
		System.out.println("       ,Bye Parent~");
	}
}

サブクラス定義:
public class Son extends Parent{
	public static String name = "    ,    ";
	public final int age = 20;
	public String birth = "    ,  ";

	public static void sayHello(){
		System.out.println("      ,Hello Child!");
	}
	public void sayBye(){
		System.out.println("       ,Bye Child!");
	}
	public static void main(String[] args){
		//1
		Parent obj1 = new Son();
		System.out.println(obj1.name);
		System.out.println(obj1.age);
		System.out.println(obj1.birth);
		obj1.sayHello();
		obj1.sayBye();
	}
}

出力結果:
  
参照
親クラスの名前、静的定数
40
親誕生日、変数
親のクラスメソッド、Hello Parent~
サブクラスのインスタンスメソッド、Bye Child
    
メイン関数には、実際のオブジェクトがnew Son()を使用して作成されたインスタンスであるSonのオブジェクトを指すParentへの参照obj 1が宣言されています.
前述の例では、obj 1ペアはParentクラスの静的メソッドsayHello()を呼び出し、SonクラスのインスタンスメソッドsayHello()を呼び出した.クラスメソッドとインスタンスメソッドの呼び出しの違いについて、「Java仮想マシンに深く入り込む」には、次のような説明があります.
参照
JVMがクラスメソッドを呼び出すと、オブジェクト参照のタイプ(通常はコンパイル時にわかります)に基づいて呼び出されたメソッドが選択されます.逆に、JVMがインスタンスメソッドを呼び出すと、実際のオブジェクトのクラス(実行時にのみ知ることができます)に基づいて呼び出されたメソッドが選択されます.
オブジェクト参照obj 1のタイプParentは、JVMにロードされてからメモリのメソッド領域で静的メソッドを維持し、SonクラスのインスタンスメソッドsayBye()は、実際のオブジェクトに呼び出されたときに動的に接続されます.
上記の解析に基づいて、クラスはメソッド領域でフィールド情報、クラス(静的)変数、定数プールも維持されているため、JVMがフィールドを呼び出すと、オブジェクト参照のタイプに基づいて呼び出されたフィールドが選択されるため、obj 1が呼び出されたフィールドは親パラメータから来ていると推測される.
注意:定数プール:定数プールは、このタイプで使用される定数の秩序化された集合です.直接定数(string、integer、floating point定数)と他のタイプ、フィールド、メソッドのシンボル参照が含まれます.プール内のデータ・アイテムは、対応するタイプで使用されるすべてのタイプ、フィールド、メソッドのシンボル参照が格納されているため、javaプログラムの動的接続性でコアとして機能します.