zoukankan      html  css  js  c++  java
  • 多态(经典案例)

    案例:打印  矩形 和 圆形

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

     多态的好处:

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/penguin1024/p/11735814.html
Copyright © 2011-2022 走看看