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