1. 程式人生 > >java多型的實現主要體現在哪些方面

java多型的實現主要體現在哪些方面

thinking in java3中的多型
People are often confused by other, non-object-oriented features of Java, like method overloading, which are sometimes presented as object-oriented. Don’t be fooled: If it isn’t late binding, it isn’t polymorphism

按文面翻譯
人們總是被java的另一種非面向物件的特性所困惑,就像方法過載,有時候它以面向物件而存在,請不要犯傻,如果沒有後期繫結(也就是執行期的動態繫結),它就不是多型.

所以,這段話要表達的意思就是說,多型要有動態繫結,否則就不是多型,方法過載也不是多型(因為方法過載是編譯期決定好的,沒有後期也就是執行期的動態繫結)

當滿足這三個條件 1.有繼承  2. 有重寫  3. 要有父類引用指向子類物件

<span style="font-size:14px;"> 

例:
public class Address {
private String name;
public Address(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

定義基類(抽象類):
public abstract class Vehicle {
abstract void go(Address address);
}

Car對於基類的實現:
public class Car extends Vehicle{
@Override
public void go(Address address){
System.out.println("Car to " + address.getName());
}
}

Plane對於基類的實現:
public class Plane extends Vehicle{
@Override
void go(Address address) {
System.out.println("Plane to " + address.getName());
}
}


Driver中多型:
public void drive(Vehicle v){ ///多型,父類引用指向子類物件,實際傳過來的是抽象類Vehicle的子類,或者實現類,然後編譯器會根據具體實現類,來找實現方法。
v.go(new Address("杭州(abstract)")); ///此方法在具體的實現中被重寫
}

Test:
public static void main(String[] args) {
Driver d = new Driver();
d.drive(new Plane()); //實際是Plane物件,則編譯器就會找到Plane中,對go的實現
d.drive(new Car()); //實際是Car物件,則編譯器就會找到Plane中,對go的實現
}

輸出結果:
Plane to 杭州(abstract)
Car to 杭州(abstract)

</span>

多型:就是指相同的事物的不同狀態,比如:水。水可以有三種狀態:
氣體、液體和固體。那麼在JAVA中的多型也可以理解成這個意思,就是:
將父物件設定成為和一個或多個它的子物件相等的技術,
比如Parent=Child;
多型性使得能夠利用同一類(父類)引用不同類的物件,
以及根據所引用物件的不同,以不同的方式執行相同的操作。
多型實現包括兩種方式:過載和重寫
例如:Animal a = new Tiger(); 這是一個老話題了,呵呵……
父類引用指向子類物件,Animal類中包含一個eat()方法,而Tiger類繼承自
Animal類,如果子類重寫了父類的eat()方法,則呼叫的時候,就可以按照子類
的形式呼叫,本質上是父類的方法,但是子類重寫之後,就成了另一種方式,
這就是多型。