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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 灵感 高级黑马   /  2012-7-13 09:54  /  3000 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严学韦 于 2012-8-9 12:14 编辑
  1. abstract class GetTime
  2. {
  3. public final void getTime()
  4. {
  5. long start = System.currentTimeMillis();
  6. runcode();
  7. long end = System.currentTimeMillis();
  8. System.out.print("毫秒:"+(end-start));

  9. }
  10. public abstract void runcode();
  11. }
  12. class SubTime extends GetTime
  13. {
  14. public void runcode()
  15. {
  16. for(int x=0;x<=1000;x++)
  17. {
  18. System.out.print(x);
  19. }
  20. }
  21. }
  22. class TempDemo
  23. {
  24. public static void main(String[] args)
  25. {
  26. SubTime s = new SubTime();
  27. s.runcode();
  28. }
  29. }
复制代码
为什么运行时间输不出来呢?我的代码跟毕老师的差不多,几乎一样的呀

11 个回复

倒序浏览
abstract class GetTime
{
public final void getTime()                                     //此处加final的意思是:这个方法不可被子类复写。也就是这部分的功能是确定的。
{
  long start=System.currentTimeMillis();

  runcode();                                                             //调用runcode方法,也就是调用不确定的部分

  long end=System.currentTimeMillis();

  System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();                            //抽象方法。也就是不确定的部分,被暴露出去了。
}

class SubTime extends GetTime
{
public void runcode()                                            //复写runcode()方法,runcode被子类来完成。
{
  for(int i=0;i<1000;i++)
  {
   System.out.print(i);
  }
}
}

class  A
{
public static void main(String[] args)
{
  SubTime s = new SubTime();
  s.getTime();                  //楼主最后得出的结果不一样是因为最后调用方法是错了。此处调用getTime()方法,执行时拿到开始时间,然后到子类执行runcode(); 然后再回getTime()      拿到结束时间,然后打印执行方法用了多少时间。                  
}
}
由代码中即可以看出父类中的getTime()方法为了防止被复写,用了final修饰符,而getTime()方法是一个确定的方法,只是获取开始时间,截止时间,以及截止时间减去开始时间。而runcode不是确定的代码,因为,要运行的程序可以改变,所需的时间也是可以改变,因此是不确定代码,不确定代码前面可以加上修饰符abstract 这样就不需要写函数体了。只需要在确定代码getTime()中加runcode()来调用,即确定代码调用不确定代码,就能实现了。而不确定代码runcode()由子类去完成,即在子类中复写了runcode(); 。在程序运行时子类继承了父类,执行getTime()获得start,然后执行调用子类中复写的runcode();再然后获得end 在执行(end-start)获得执行时间。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
{:soso__6235880048239246314_3:}
回复 使用道具 举报
本帖最后由 陆强强 于 2012-7-13 10:08 编辑

public static void main(String[] args)

{

SubTime s = new SubTime();

s.runcode();//注意这里
}
因为你调用的是SubTime的runcode(),所以只要运行这部分代码就可以了


public void runcode()

{

for(int x=0;x<=1000;x++)

{

System.out.print(x);

}

}


}
想要得到运行时间就改成s.getTime();就好了
回复 使用道具 举报
你的运行情况是这样的

QQ截图20120713100443.png (7.12 KB, 下载次数: 40)

QQ截图20120713100443.png
回复 使用道具 举报
楼上看错主函数的类了,他的主函数在class TempDemo

{

public static void main(String[] args)//这里
回复 使用道具 举报
SubTime s = new SubTime();
s.runcode();
调用的是子类的runcode()方法。只是输出循环打印,根本没有用到调用时间的方法啊。
改成s.getTime()
回复 使用道具 举报
芦曦 中级黑马 2012-7-13 10:42:39
8#
abstract class GetTime

{

public final void getTime()

{

long start = System.currentTimeMillis();

runcode();

long end = System.currentTimeMillis();

System.out.print("毫秒:"+(end-start));


}

public abstract void runcode();

}

class SubTime extends GetTime

{

public void runcode()

{

for(int x=0;x<=1000;x++)

{

System.out.print(x);

}

}

}

class TempDemo

{

public static void main(String[] args)

{

SubTime s = new SubTime();

s.runcode();//这里调用的是子类的runcode()方法输出的是从0到1000的数值。如果要输出的是runcode()方法运行的时间,这里应该改为
  s.getTime();  输出的就是runcode()方法从开始到结束时的运行时间了。

  
}

}
回复 使用道具 举报
class TempDemo
{
      public static void main(String[] args)
        {
           SubTime s = new SubTime();
           s.getTime();//这里改掉就OK了,
         }
}

s.runcode();//调用runcode方法只会执行for循环,而不进行计算,因为没有调用getTime。
回复 使用道具 举报
首先,楼主你的代码中没有声明为public的类,一个java文件只能有一个public类,而且此类的名字须与文件名一致,你的主函数在TempDemo
类中,所以要把这个类声明为public,你的主函数中调用的是对象的runcode()方法,也就是打印方法,按你的意思是应该调用继承自父类的getTime()方法的,
23.class TempDemo

24.{

25.public static void main(String[] args)

26.{

27.SubTime s = new SubTime();

28.//s.runcode();这只是你的打印方法
     s.getTime();//调用该方法,可获取程序执行的时间差

29.}

30.}
对于类命名为public类型的问题,你可以参看一下这个网址:http://hi.baidu.com/shouzhewei/item/59021b0af51f07d573e6761f
回复 使用道具 举报
高手真多,受益匪浅
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马