2014年4月16日 星期三

多型:父子類別間之型別轉型

類別檔: Shape.java
public class Shape {
 public double x=5, y=10;
 public double r=10;
 public void draw() {
  System.out.println("圖形繪畫"); 
 }
}
類別檔: Rectangle.java
public class Rectangle extends Shape{
 public void draw() {
  System.out.println("矩形面積 :" + x * y);
 }
 
 public double area(double x, double y){
  return x * y;
 }
}
若測試時,父類別欲參考子類別新增加的資料或方法時,會有什麼情況發生?

類別檔: ShapeTest.java
public class ShapeTest {

 public static void main(String[] args) {
  Shape obj = new Rectangle();
  obj.draw();
  System.out.println("Area: " + obj.area(3.0, 8.0));
 }
}

此時編譯仍然會成功,但因 Shape 父類別沒有定義 area() 函數,這函數無法被 Shape 物件參照(reference),而會產生錯誤









父類別變數要參考到子類別新增加的資料或方法,需將父類別變數的資料形態,轉換成其子類別的資料形態。上面程式修改如下:
public class ShapeTest {

 public static void main(String[] args) {
  Shape obj = new Rectangle();
  obj.draw();
  System.out.println("Area: " + ((Rectangle) obj).area(3.0, 8.0));
 }
}


執行結果:

沒有留言:

張貼留言