Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 424|回复: 0

[Java基础知识]java多态性教学实例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 04:13:10 | 显示全部楼层 |阅读模式
    最近研究面向对象中的[多态性],我就写了一个非常简单的例子说明一下。该例子功能很简单,有些地方由于时间原因也没有仔细考虑,只能做个简单参考。

          先介绍一下例子,很简单,这个程序可以选择事先定义的一种形状,然后绘制到窗口的绘图区域。其类的关系图如图(SimperDrawer.png),图中因为大小关系,有些画的不规范。

           在这个程序中画图使用了多态性应用,所以增加图形种类时,几乎不需要修改源程序代码。其中创建对象时使用了“工厂方法”的最基本思想和“原型模式”。

    一、基本方法介绍:

    1、对象的创建方法:
           在ToolBar类中,生成与按钮对应的形状对象时,没有使用new操作符,而是使用java的反射机制,动态加载类后使用newInstance方法创建对象。代码段如下:

               
                
                
                  
                

                
                
               
             
             
    // ToolBar.java
             
    ......
             
    for(int i=0;i<shapeTypes.length;i++) {
             
       try {
             
           s = (Shape)shapeTypes.newInstance();
             
           shapes.add(s);
             
           JToggleButton b = new JToggleButton(s.getClass().getName());
             
           buttons.add(b);
             
           this.add(b);
             
        } catch(InstantiationException e) {
             
           System.err.println("Cannot instantiate!");
             
        } catch(IllegalAccessException e) {
             
           System.err.println("Cannot Access!");
             
        }
             
    }
             
    ......
             

             
    2、“原型模式”使用
             

             
    用户在绘图时,选择了ToolBar中某图形后,画图时产生对象也不是用new操作符,而是使用“原型模式”原理,由ToolBar中对象Clone得到绘制的对象,代码段如下:
             

             

             
    // drawPanel.java
             
    ......
             
    public DrawPanel(ToolBar tbar, Picture pic) {
             
        this.toolbar = tbar;
             
        this.picture = pic;
             
        this.setBackground(Color.WHITE);
             

             
        this.addMouseListener(new MouseAdapter() {
             
            public void mousePressed(MouseEvent event) {
             
              double cx = event.getX();
             
              double cy = event.getY();
             

             
              // 下面一句由复制得到绘制的图形对象
             
             Shape s = (Shape)toolbar.getSelected().clone();
             

             
              if(s!=null) {
             
                s.setLocation(cx, cy);
             
                picture.add(s);
             
                repaint();
             
              }
             
           }
             
        });
             
    }
             

             
    3. 多态性使用
             

             
    在真正绘图操作时,使用多态方式,
             

             
    首先,在DrawPanel.java中:
             
    ......
             
    public void paintComponent(Graphics g)
             
    {
             
        super.paintComponent(g); // call method of parent class
             
        Graphics2D g2 = (Graphics2D)g;
             
        // 调用picture对象的draw方法,绘制已经产生的所有图形对象
             
        // picture对象中存放了所有已经产生的图形对象
             
        picture.draw(g2);
             
    }
             
    ......
             

             
    其次,Picture类的draw方法如下定义:(Picture.java)
             

             
    public void draw(Graphics2D g2) {
             
        for(int i=0;i<picList.size();i++) {
             
           // 使用多态性,绘制一个具体的图形对象。
             
           Shape s = (Shape)picList.get(i);
             
           s.draw(g2);
             
         }
             
    }
             

             
    二、多态性带来的一些好处
             

             
    当需要扩展具体图形的种类时,只需做2件事:
             

             
    1、定义新的图形类,可以直接实现Shape接口,或者象例子中,继承AbstractRectShape抽象类。 这里AbstractRectShape抽象类是对所有可以通过一个矩形区域绘制的图形的抽象,它实现了Shape接口。还可以定义其它抽象类实现接口Shape,如:AbstractLine抽象类等。
             

             
    比如:可以增加一个 梯形 图形,可以:
             

             
    package PDemo;
             

             
    import ...
             

             
    public class Trapezium extends AbstractRectShape {
             
    // 具体实现
             
    ....
             
    }
             

             
    编译该类,加入包。
             

             
    2、打开ToolBar.java,在以下数组中增加一行
             

             
    public Class[] shapeTypes = {
             
        Rectangle.class,
             
        Circle.class,
             
        Triangle.class,
             
         Ellipse.class
             
    };
             

             
    变成:
             

             
    public Class[] shapeTypes = {
             
        Rectangle.class,
             
        Circle.class,
             
        Triangle.class,
             
        Ellipse.class,
             
        Trapezium.class //新增的类
             
    };
             

             
    编译该类。
             

             
    3、这样程序中就可以处理新的类了。
             

             
    注意:其实可以通过别的方法,使第2步中,增加新类也不必修改源程序,这里由于简化程序的目的,没有实现。
             

             
    运行图:
             
      
             
            
          
       
         
         
          
          
          
          
            
          
          
         
       
      
      
    1.    
    复制代码

      


    源码下载:http://file.javaxxz.com/2014/10/2/041310500.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-3 22:07 , Processed in 0.387348 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表