案例:打印 矩形 和 圆形
矩形: 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)); } }
多态的好处: