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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-5 22:10  /  1284 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 2013-2-6 08:34 编辑

毕老师的第七天的视频中有个《模板方法模式》里讲到这样一段代码:
  1. /*
  2. 需求:获取一段程序运行时间
  3. 原理:获取程序开始的时间和结束的时间并相减,即得程序运行的时间
  4. 获取时间:System.currentTimeMillis();
  5. */

  6. class GetTime
  7. {
  8.       public void getTime()
  9.       {
  10.            long start = System.currentTimeMillis();
  11.            runcode();
  12.            long end = System.currentTimeMillis();
  13.            System.out.println("时间为:" + (end - start));
  14.       }
  15.         
  16.      public void runcode()
  17.     {
  18.          for (int i=0;i<1000;i++)
  19.         {
  20.              System.out.print("i1=" + i);
  21.          }
  22.                
  23.     }
  24. }

  25. class SubTime extends GetTime
  26. {
  27.      public void runcode()
  28.     {
  29.         for (int i=0;i<4000;i++)
  30.        {
  31.             System.out.print("i2=" + i);
  32.         }
  33.    }
  34. }

  35. class TemplateDemo
  36. {
  37.      public static void main(String[] args)
  38.      {
  39.          //GetTime gt = new GetTime();
  40.          SubTime sub = new SubTime();
  41.          sub.getTime();
  42.      }
  43. }
复制代码
为什么runcode()复写后调用的是子类的runcode(),虽然说是复写了,但是实际上,并没有覆盖父类中的runcode()方法啊,要是定义一个方法,用super调用runcode(),仍是调用的父类中的runcode()啊。
那么在父类中调用的runcode()前面应该有隐式的this吧,既然调用的是子类的runcode(),那么这里的隐式this是代表的子类;
可是毕老师说过,this是代表本类的引用,那在这里this怎么代表子类这个引用了呢?
简单来说,有这么两个问题不解:
1、为什么在父类中有与子类相同的方法,会直接调用子类,而不调用本类的
2、这里如果有隐式this的话,那么为什么this不代表本类的引用,而是代表子类的引用?对this用法还是有些迷惑。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

5 个回复

倒序浏览
package cn.itcast.test;

/*
需求:获取一段程序运行时间
原理:获取程序开始的时间和结束的时间并相减,即得程序运行的时间
获取时间:System.currentTimeMillis();
*/

class GetTime
{
      public void getTime()
      {
           long start = System.currentTimeMillis();
           runcode();
           long end = System.currentTimeMillis();
           System.out.println("时间为:" + (end - start));
      }

     public void runcode()
    {
         for (int i=0;i<10;i++)
        {
             System.out.print("i1=" + i);
         }

    }
}

class SubTime extends GetTime
{
     public void runcode()
    {
        for (int i=0;i<10;i++)
       {
            System.out.print("i2=" + i);
        }
   }
}

class Test3
{
     public static void main(String[] args)
     {
         //GetTime gt = new GetTime();
         SubTime sub = new SubTime();
         sub.getTime();
         GetTime get = new GetTime();
         get.getTime();
     }
}

你new的SubTime的对象人家当然调用SubTime的方法啊
我在你的代码上又new了个GetTime的对象,它肯定调用GetTime的方法.


回复 使用道具 举报
  1. SubTime sub = new SubTime();
  2.          sub.getTime();
复制代码
这个完全是SubTime类。
复写了,就覆盖了。
但是覆盖的是子类的函数,而不是父类的函数。

回复 使用道具 举报
你没有用到多态的知识啊,多态是 GetTime gt = new SubTime();
回复 使用道具 举报
郭冰川 发表于 2013-2-5 22:28
package cn.itcast.test;

/*

按你说的,我加上了 GetTime get = new GetTime();和get.getTime();测试后,结果确实是运行的父类的函数。我突然有些明白了,也就是说谁调用方法,那个隐式this就引用的是谁,而不管this是存在于哪个函数之中。谢谢你啊
回复 使用道具 举报
你用子类的对象调用子类的方法了,所以结果是这样子。如果父类引用指向子类对象,这是调用子类从父类继承的方法,会运行父类中的runcode方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马