A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Jiewin 于 2013-5-30 17:08 编辑

看到模板方法模式那里有个例子,第四行代码加了final后,有几个疑惑!
1、可以理解是禁止被子类继承吗?如果这样,我就能理解。
2、老师说的是禁止子类重写,但是子类中并没有用到GetTime()这个方法啊,怎么理解呢?

  1. abstract class GetTime
  2. {
  3. //禁止getTime()方法被子类继承,设置为final
  4. public final void GetTime()
  5. {
  6. long start = System.currentTimeMillis();
  7. runcode();
  8. long end = System.currentTimeMillis();
  9. System.out.println("用时"+(end-start)+"毫秒");
  10. }
  11. public abstract void runcode();
  12. }

  13. class SubTime extends GetTime
  14. {
  15. public void runcode()
  16. {
  17. for (int x=0;x<5000 ;x++ )
  18. {
  19. System.out.print(x+" ");
  20. }
  21. }
  22. }

  23. class TimeDemo
  24. {
  25. public static void main(String[] args)
  26. {
  27. SubTime gt = new SubTime();
  28. gt.GetTime();
  29. }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 就是为了防止定义的功能被覆盖掉,失去功能.

查看全部评分

7 个回复

倒序浏览
final方法要这样理解
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。
老师例子的意思是用getTime() 方法去获取new subTime();中 那个For循环所用的时间
像你说的:子类中并没有用到GetTime()这个方法啊  ,这个没用调用了就是!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
添加 final 只是意味着不能改变了,方法一样可以被子类继承, 只是禁止子类重写了,
例子中timeDemo 类中不是用子类对象调用这个方法了吗

点评

一语惊醒梦中人,在主函数那里有调用到,看来我的失望就是没有看全代码!这点我表示立刻纠正。现在已经解决此问题了,楼下的不用回答啦!  发表于 2013-5-30 16:37

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
模板方法模式是一个算法的步骤,并允许次类别为一个或多个步骤提供其实践方式。让次类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
GetTime类主要是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。GetTime()方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
这样来说吧,假如我们要发表博客。我们必须登陆博客->写博客->发表博客。
abstract 博客
{
   public final 发表博客(){
       登陆博客();
       写博客();
       发表博客();
  }
   protected abstract void 登陆博客();
   protected abstract void 写博客();
   protected abstract void 发表博客();
}
之后,无论是CSDN、163、新浪的博客。
public class CSDN extends 博客{
protected void 登陆博客(){
//帐号密码
}
   protected void 写博客(){
//内容

   protected void 发表博客(){
//发表

}

public class WY_163 extends 博客{
protected void 登陆博客(){
//帐号密码
}
   protected void 写博客(){
//内容

   protected void 发表博客(){
//发表

}
最后都可以通过    发表博客()  的方法可以得到调用。
public static void main(){
CSDN  csdn = new CSDN ();
csdn.发表博客() ;
WY_163  wy_163 = new WY_163 ();
wy_163.发表博客() ;
}
在这一个例子中,你会发现无论那个博客,都是同样的步骤。因此这里需要final修饰方法,将完法被重写。这样保证步骤不会被改变。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
lxf_cat5277 发表于 2013-5-30 16:40
模板方法模式是一个算法的步骤,并允许次类别为一个或多个步骤提供其实践方式。让次类别在不改变算法架构的 ...

意思是被final修饰的方法,不可以被覆盖,但此方法所在的类可以被子类继承?
回复 使用道具 举报
如果帖子没有问题了,请把帖子的类型改为“已解决”
如果不会改,请看我的个性签名
回复 使用道具 举报
本帖最后由 lxf_cat5277 于 2013-5-31 11:03 编辑
Jiewin 发表于 2013-5-30 16:53
意思是被final修饰的方法,不可以被覆盖,但此方法所在的类可以被子类继承? ...
使用final方法的原因只有:第一,把方法锁定,以防任何继承修改它的含义。第二,效率。我们这里用的是第一种原因,所以final方法的使用是想要确保在继承中使用方法行为保持不变,因此不能被覆盖。
回复 使用道具 举报
看帖必转真君子,好贴必顶大丈夫
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马