Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java SE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 小心重写方法,正确实现多态
polygoncell





发贴: 14
积分: 2
于 2005-03-21 23:17 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
这是我今天在工作中碰到的问题,是关于继承和多态的。同事对项目中的一项基础功能进行了重构,可是当我们从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个人天!可怕吧!

请关注我的blog
http://blog.csdn.net/schnell/




话题树型展开
人气 标题 作者 字数 发贴时间
4268 小心重写方法,正确实现多态 polygoncell 1711 2005-03-21 23:17
3235 Re:小心重写方法,正确实现多态 bloodwolf 24 2005-03-23 09:26
3240 Re:小心重写方法,正确实现多态 fat32 10 2005-03-26 21:07
3250 Re:小心重写方法,正确实现多态 bluepure 43 2005-03-27 03:14
3242 Re:小心重写方法,正确实现多态 power6554 3 2005-04-10 14:27
3227 Re:小心重写方法,正确实现多态 power6554 3 2005-04-10 14:27
3393 Re:小心重写方法,正确实现多态 anit 12 2005-04-10 17:35

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923