Java多型性的理解
阿新 • • 發佈:2019-01-26
多型的目的
通過型別轉換,把一個物件當作它的基類物件對待。
從相同的基類派生出來的多個派生類可被當作同一個型別對待,可對這些不同的型別進行同樣的處理。
這些不同派生類的物件響應同一個方法時的行為是有所差別的,這正是這些相似的類之間彼此區別的不同之處。
動態繫結
將一個方法呼叫和一個方法主體連線到一起稱為繫結(Binding)。
根據繫結的時機不同,可將繫結分為“早期繫結”和“後期繫結”兩種。
如果在程式執行之前進行繫結(由編譯器和連結程式完成),稱為早期繫結。
如果在程式執行期間進行繫結,稱為後期繫結,後期繫結也稱為“動態繫結”或“執行時繫結”。
在Java中,多型性是依靠動態繫結實現的,即Java虛擬機器在執行時確定要呼叫哪一個同名方法。
多型的應用
由於多型性,一個父類的引用變數可以指向不同的子類物件,並且在執行時根據父類引用變數所指向物件的實際型別執行相應的子類方法。
利用多型性進行二次分發。
利用多型性設計回撥方法。
多型的例子
Shape類是幾個具體圖形類的父類
package cn.edu.uibe.poly; public class Shape { public void draw(){ System.out.println("Shape.draw()"); } } package cn.edu.uibe.poly; public class Shape { public void draw(){ System.out.println("Shape.draw()"); } }
Rectangle類是Shape類的一個子類
package cn.edu.uibe.poly; public class Rectangle extends Shape { @Override public void draw() { System.out.println("畫矩形"); } } package cn.edu.uibe.poly; public class Rectangle extends Shape { @Override public void draw() { System.out.println("畫矩形"); } }
Circle類也是Shape類的子類
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("畫圓");
}
}
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("畫圓");
}
}
Triangle類是Shape類的另外一個子類
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("畫三角形");
}
}
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("畫三角形");
}
}
ShapeDemo類中隨機生成矩形、圓、三角形,然後用Shape型別的引用呼叫。
package cn.edu.uibe.poly;
import java.util.*;
public class ShapeDemo {
Random rand = new Random();
public Shape createShape(){
int c = rand.nextInt(3);
Shape s = null;
switch(c){
case 0:
s = new Rectangle();
break;
case 1:
s = new Circle();
break;
case 2:
s = new Triangle();
break;
}
return s;
}
public static void main(String[] args) {
ShapeDemo demo = new ShapeDemo();
Shape[] shapes = new Shape[10];
for(int i=0;i<shapes.length;i++){
shapes[i] = demo.createShape();
}
for(int i=0;i<shapes.length;i++){
shapes[i].draw();//同樣的訊息,不同的響應
}
}
}
這是我看到的對多型性理解最深刻的文章了