案例:打印 矩形 和 圓形
矩形: x(橫坐標), y(縱坐標),length(長度), wid(寬度)
圓形: x(橫坐標), y(縱坐標), r(半徑)
思路:
矩形 和 圓形 都有 共同的元素:x(橫坐標), y(縱坐標)
那么可以把x, y抽取出來 定義出一個 形狀類作為父類,形狀類中 包含這兩個屬性。
定義一個 矩形類,繼承 形狀類。在自己類中擴展 length(長度), wid(寬度)屬性
定義一個 圓形類,繼承 形狀類。在自己類中擴展 r(半徑) 屬性
寫一個測試類,定義相應的方法 來實現功能。
代碼實現:
1.定義一個形狀類:
public class Shape { // 形狀類 private int x; // 描述橫坐標 private int y; // 描述縱坐標 public Shape() { super(); } public Shape(int x, int y) { super(); // this.x = x; // this.y = y; setX(x); // 推薦這種寫法,可以對x,y值做判斷。只需在對應方法中,設置判斷條件即可 setY(y); } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public void show() { System.out.println("橫縱坐標:("+getX()+","+getY()+")"); } }
2.定義一個矩形類
// 矩形類 public class Rect extends Shape { private int len; //描述長度信息 private int wid; //描述寬度信息 public Rect() { super(); } public Rect(int x, int y,int len, int wid) { super(x, y); setLen(len); setWid(wid); } public int getLen() { return len; } public void setLen(int len) { this.len = len; } public int getWid() { return wid; } public void setWid(int wid) { this.wid = wid; } @Override public void show() { System.out.println("我是個矩形"); super.show(); System.out.println("長度:"+getLen()+"寬度:"+getWid()); } }
3.定義一個圓形類
// 定義 圓形類 public class Circle extends Shape { private int r; //描述半徑 public Circle() { super(); } public Circle(int x, int y, int r) { super(x, y); setR(r); } public int getR() { return r; } public void setR(int r) { this.r = r; } @Override public void show() { System.out.println("我是個圓形"); super.show(); System.out.println("半徑:"+getR()); } }
4.定義一個測視類,並編寫對應的方法來實現功能
package com.monkey1025; public class Test { // 自定義一個方法:最好定義成靜態方法,無需new對象,使用 類名.靜態方法()名 的方式調用 // 要求:該方法既能打印 矩形 又能 打印圓形,具體圖形 由 參數傳入
public static void draw(Shape s) { // 讓父類Shape作為形參,這樣的話 實參既能是本類的對象,又可以傳遞子類的對象 // Shape類型的s 在編譯階段只能調用 Shape類型 自己的show()方法 // 但是Shape的任意一個子類對show()方法進行了重寫,在運行階段則調用子類自己重寫的方法 s.show(); } public static void main(String[] args) { // Test.draw(s); 該方法形參需要的是 Shape類型的引用,參既能是本類的對象,又可以傳遞子類的對象 // 創建矩形類的匿名對象 作為實參傳遞給形參 // 其實相當於: Shape s = new Rect(1,2,3,4); 形成了多態 Test.draw(new Rect(1,2,3,4)); System.out.println("-----------------------------"); // 創建圓形類的匿名對象 作為實參傳遞給形參 // 其實相當於: Shape s = new Circle(5,6,7); 形成了多態 Test.draw(new Circle(5,6,7)); } }
多態的好處: