淺談Java中的過載,重寫,多型,靜態繫結、動態繫結

NO IMAGE

本文主要研究的是關於Java中過載,重寫,多型,靜態繫結、動態繫結的相關內容,具體如下。

過載,英文名是overload,是指在一個類中定義了一個以上具有相同名稱的方法,這些方法的引數個數、引數型別和順序不能相同。返回型別可以相同,也可以不同。


public class TstaticOverload {
	static int height;
	TstaticOverload() {
		System.out.println ("Planting a seedling");
		height = 0;
	}
	TstaticOverload(int initialHeight) {
		height = initialHeight;
		System.out.println("Creating new Tree that is "  height   " feet tall");
	}
	static void info() {
		System.out.println("Tree is "   height   " feet tall");
	}
	static void info(String s) {
		System.out.println(s   ": Tree is "   height   " feet tall");
	}
}

public class testSO {
	public static void main (String [] args) {
		TstaticOverload t = new TstaticOverload(5);
		TstaticOverload.info();
		TstaticOverload.info("overloading method");
		new TstaticOverload();
	}
}

out: 
Creating new Tree that is 5 feet tall 
Tree is 5 feet tall 
overloading method: Tree is 5 feet tall 
Planting a seedling 

重寫,英文名是override,是指在繼承情況下,子類中定義了與其基類中方法具有相同名稱、相同返回型別或相容型別和相同引數的方法,就叫做子類把基類的方法重寫了。這是實現多型必須的步驟。

多型:多型是同一個行為具有多個不同表現形式或形態的能力。


public class StaticSupper {
	public static String staticGet() {
		return "Base staticGet()";
	}
	public String dynamicGet() {
		return "Base dynamicGet()";
	}
}
class StaticSub extends StaticSupper {
	public static String staticGet() {
		return "Sub staticGet()";
	}
	public String dynamicGet() {
		return "Sub dynamicGet()";
	}
}
class StaticMub extends StaticSupper {
	public static String staticGet() {
		return "Mub staticGet()";
	}
	public String dynamicGet() {
		return "Mub dynamicGet()";
	}
}

public class StaticPolymorphism { 
  public static void main (String [] args) { 
    StaticSupper sup1 = new StaticSub(); 
    System.out.println(sup1.staticGet()); 
    System.out.println(sup1.dynamicGet()); 
     
    StaticSupper sup2 = new StaticMub(); 
    System.out.println(sup2.staticGet()); 
    System.out.println(sup2.dynamicGet()); 
  } 
} 

out: 
Base staticGet() 
Sub dynamicGet() 
Base staticGet() 
Mub dynamicGet() 

程式繫結的概念:

繫結指的是一個方法的呼叫與方法所在的類(方法主體)關聯起來。對java來說,繫結分為靜態繫結和動態繫結;或者叫做前期繫結和後期繫結。

靜態繫結:

在程式執行前方法已經被繫結,此時由編譯器或其它連線程式實現。例如:C。

針對Java簡單的可以理解為程式編譯期的繫結;這裡特別說明一點,java當中的方法只有final,static,private和構造方法是前期繫結。

動態繫結:

後期繫結:動態繫結是指編譯器在編譯階段不知道要呼叫哪個方法,直到執行時根據具體物件的型別進行繫結。

若一種語言實現了後期繫結,同時必須提供一些機制,可在執行期間判斷物件的型別,並分別呼叫適當的方法。也就是說,編譯器此時依然不知道物件的型別,但方法呼叫機制能自己去調查,找到正確的方法主體。不同的語言對後期繫結的實現方法是有所區別的。但我們至少可以這樣認為:它們都要在物件中安插某些特殊型別的資訊。

方法過載有靜態方法過載和普通方法過載。靜態方法過載是靜態繫結,方法呼叫是通過:類名.方法。普通方法過載是動態繫結,方法呼叫是通過:例項物件引用.方法。構造器能夠過載,但是不能夠被重寫。

靜態方法能夠被重寫,但是沒有實現多型效果。

總結