【Thinking in Java】七:多態

[b]1 向上轉型[/b]
寫一個方法,它僅接收基類作爲參數,而不是那些特殊的導出類,也就是說編寫的代碼只與基類打交道,這正式多態所允許的。

簡單例子:


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可以看出

如有繼承 ,先調用基類

類中的調用順序爲 靜態代碼塊 -->按聲明順序調用成員初始化 -->構造函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章