<%@ page contentType="text/html; charset=gb2312"%> java多态性教学实例
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
java多态性教学实例
     发布者: 发布时间:2007-01-13

    最近研究面向对象中的[多态性],我就写了一个非常简单的例子说明一下。该例子功能很简单,有些地方由于时间原因也没有仔细考虑,只能做个简单参考。

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

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

一、基本方法介绍:

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

// ToolBar.java
......
for(int i=0;i<shapeTypes.length;i++) {
  try {
      s = (Shape)shapeTypes[i].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步中,增加新类也不必修改源程序,这里由于简化程序的目的,没有实现。

运行图:


   

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
jsp处理表单的一些经验分享
Java反射经典实例
使用Java中的Date和Calendar类
try catch finally与return的执行顺序
prototype(原型)模式
格式化输出数字
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(8766)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(9234)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(2986)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号