寫一個方法,它僅接收基類作爲參數,而不是那些特殊的導出類,也就是說編寫的代碼只與基類打交道,這正式多態所允許的。
簡單例子:
class Cycle {
private String name = "Cycle";
public static void travel(Cycle c) {
println("Cycle.ride() " + c);
}
public String toString() {
return this.name;
}
}
class Unicycle extends Cycle {
private String name = "Unicycle";
public String toString() {
return this.name;
}
}
public class Biking {
public static void ride(Cycle c) {
c.travel(c);
}
public static void main(String[] args) {
Unicycle u = new Unicycle();
ride(u);
}
[b]二 多態實現[/b]
一個方法調用和一個方法主體關聯起來被稱作綁定。
編譯時,無法知道父類引用指向子類對象,Java解決的方法是動態綁定,在運行時根據對象的類型進行綁定,後期綁定機制,需要在對象中存有某種‘類型信息’。
2.1多態不支持私有方法
class Father{
private void v(){
System.out.println("super v");
}
public static void main(String[] args) {
Father f = new Son();
f.v();
}
}
class Son extends Father{
private void v(){
System.out.println("son v");
}
}
[color=red]output--> super v[/color]
2.2 多態不支持域和靜態方法
class Father{
public int field = 0;
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.field);
}
}
class Son extends Father{
public int field = 1;
}
[color=red]output--> 0[/color]
靜態方法這個 大家可以參考上面的私有方法改寫試一下。
靜態方法是與類,而並非與單個的對象關聯的。
[b]三 多態與構造器[/b]
class Father{
public Father(){
System.out.println("123");
}
}
class Son {
public Son(){
System.out.println("1234");
}
{
System.out.println("dksjk");
}
private Father f= new Father();
static{
System.out.println("222");
}
public static void main(String[] args) {
new Son();
}
}
[color=red]output--> 222 dksjk 123 1234[/color]
代碼示例中沒有繼承,但是通過demo可以看出
如有繼承 ,先調用基類
類中的調用順序爲 靜態代碼塊 -->按聲明順序調用成員初始化 -->構造函數