オーバーロードとオーバーライドについて考える

2882 ワード

1、リロード-overload---静的配分
一般的には、1つのクラス内でいくつかのリロードを実現するための方法であり、これらの方法の名前は同じであり、パラメータ形式は異なる.
            
package jvm;

public class StaticDispach {
	static abstract class Human{
		
	}
	static class Man extends Human{
		
	}
	static class Woman extends Human{
		
	}
	public void sayHello(Human guy){
		System.out.println("hello guy");
	}
	public void sayHello(Man guy){
		System.out.println("hello man");
	}
	public void sayHello(Woman guy){
		System.out.println("hello woman");
	}
	public static void main(String[] args) {
		Human man = new Man();
		Human woman = new Woman();
		StaticDispach sr = new StaticDispach();
		sr.sayHello(man);
		sr.sayHello(woman);
	}
}

実行結果:
hello guy
hello guy

パラメータがHumanのリロードを実行するのはなぜですか?
Human man = new Man();

2つの概念が必要です.1、Static Type(静的タイプ)はApparent Type(外観タイプ)----Humanとも呼ばれます.
2、Actual Type(実際のタイプ)---Man()
静的タイプの変化は使用時にのみ発生し、変数自体の静的タイプの変化は使用時に密接に発生し、変数自体の静的タイプは変化せず、最終的な静的タイプは実際にコンパイル期間が知られている.実際のタイプが変化した結果は、実行期間によって決定され、コンパイラはコンパイラ時にオブジェクトの実際のタイプが何であるか分からない.
リロード時に仮想マシンはパラメータの静的タイプを判定の根拠とする.
  // 
  Human man = new Man();
  man = new Woman();
  
  // 
  sr.sayHello((Man)man);
  sr.sayHello((Woman)man);

次は極端なリロードコードです.
public class Overload {
	public static void sayHello(Object arg) {
		System.out.println("hello Object");
	}

	public static void sayHello(int arg) {
		System.out.println("hello int");
	}

	public static void sayHello(long arg) {
		System.out.println("hello long");
	}

	public static void sayHello(Character arg) {
		System.out.println("hello Character");
	}

	public static void sayHello(char arg) {
		System.out.println("hello char");
	}

	public static void sayHello(char... arg) {

		System.out.println("hello char ...");
	}

	public static void sayHello(Serializable arg) {
		System.out.println("hello Serializable");
	}

	public static void main(String[] args) {
		sayHello('a');
	}
}

2、overrideを書き換える---動的配分
一般的に、子クラスが親クラスを上書きする方法に使用されます.親を再実装する方法.
public class DynamicDispatch {
	static abstract class Human {
		abstract void sayHello();
	}

	static class Man extends Human {
		@Override
		void sayHello() {
			System.out.println("man say hello'");
		}
	}

	static class Woman extends Human {
		@Override
		void sayHello() {
			System.out.println("woman say hello'");
		}
	}

	public static void main(String[] args) {
		Human man = new Man();
		Human woman = new Woman();
		man.sayHello();
		woman.sayHello();
		man = new Woman();
		man.sayHello();
	}
}

出力結果
man say hello
woman say hello
woman say hello

これは、仮想マシンが実際のタイプに応じてメソッドを割り当てるために実行されるためです.
継承関係に従って、底から上へ方法を探します.