快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

小心重写方式,准确实现多态

这是我今天在工作中遇到的问题,是关于继续和多态的。同事对项目中的一项基础功能进行了重构,可是当我们从CVS服务器上更新了项目源代码并编译了之后,发现这项功能已不能正常工作了。先撇开这个同事所犯的错误(对代码进行重构后没有测试他的新代码就上传到了CVS服务器上)不说,在这里我就说说这个问题所带出来的JAVA konwhow.由于我们的项目比较复杂,我在这里采取比较简朴的例子来讲解这个问题。首先,我们有2个类:supper.TestSupper.java 和sub.TestSub.java。他们的代码是这样的:package supper;public class TestSupper {        String getString()    {        return "This is supper class.";    }}-----------------------------------package sub;import supper.TestSupper;public class TestSub extends TestSupper {  public String getString(){        return "This is sub class.";    }}十分简朴,第一眼看上去,你会觉得TestSub继续了TestSupper并且重写getString()方式。现在我们写一个测试程序:package supper;import sub.TestSub;public class Test {    public static void main(String[] args) {        TestSupper test = new TestSub();        System.out.println(test.getString());    }}请注重啊!测试程序和TestSupper在同一个包里。从理论上说,这个测试程序应该输出“This is sub class”,因为test的实体是一个TestSub对象而不是TestSupper。所以,当我们调用test.getString()时,真正被调用的应该是TestSub里的getString()。可是事实如何呢?输出是"This is supper class."!为什么会这样的?原因很简朴,因为在TestSupper里方式getString()的标签(signature)是"default",是默认的不用写出来。这导致这个方式只能在这个包里面可见。TestSub虽然继续了TestSupper,却没有办法“看见”getString()方式,因为TestSub在另外一个包里。所以当我们在测试程序里调用test.getString(),程序首先会寻找TestSub中是否重写了这个方式,在这里请一定要注重标签是default的,当然是没有发现。结果程序就会调用父类的相应方式,故父类中的结果就被输出了。解决的办法很简朴,但凡是要被重写的方式一定不能定义成“default”,最少要定义成"protected”.假如你是在使用Eclipse的话,你可以在eclipse中进行设置,把这种情况视为Error就可以避免这种错误的产生。方式是:window ->preferences -> style ->methods overridden but not pachage visible这项选为Error。我用的是eclipse3.0。后话别看这是个很小的问题,而且很简朴,一看就明白,可是当系统出现了问题,而你要在几百个类中寻找到问题所在的时候,这种不易察觉的错误绝对是致命的。寻找这个错误花了我们2个人天!可怕吧!



返回类别: 教程
上一教程: ECLIPSE初学手记(1)
下一教程: 利用XMLBuddy在Eclipse中开发XML

您可以阅读与"小心重写方式,准确实现多态"相关的教程:
· 如何准确实现多线程安全的singleton patterns
· 实现 Java 平台的三种方法
· 用SERVLETS实现WEB方法的文件下传
· Java运行时多态性的实现
· JAVABEAN实现多文件上传的两种方式
    微笑服务 优质保证 索取样品