多态(经典案例)

案例:打印  矩形 和 圆形

矩形: 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)); } }

 

 


 

 多态的好处:

 

posted @ 2019-10-24 23:51  小茅棚  阅读(1940)  评论(0编辑  收藏  举报