黑马程序员技术交流社区

标题: 真心求解,一个复写的问题 [打印本页]

作者: 灵感    时间: 2012-7-13 09:54
标题: 真心求解,一个复写的问题
本帖最后由 严学韦 于 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. }
复制代码
为什么运行时间输不出来呢?我的代码跟毕老师的差不多,几乎一样的呀

作者: 灵感    时间: 2012-7-13 09:55
{:soso__6235880048239246314_3:}
作者: 陆强强    时间: 2012-7-13 10:05
本帖最后由 陆强强 于 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();就好了

作者: 黑马---邢志伟    时间: 2012-7-13 10:05
你的运行情况是这样的

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

QQ截图20120713100443.png

作者: 陆强强    时间: 2012-7-13 10:09
楼上看错主函数的类了,他的主函数在class TempDemo

{

public static void main(String[] args)//这里
作者: 黑马振鹏    时间: 2012-7-13 10:10
SubTime s = new SubTime();
s.runcode();
调用的是子类的runcode()方法。只是输出循环打印,根本没有用到调用时间的方法啊。
改成s.getTime()
作者: 万宝东    时间: 2012-7-13 10:21
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)获得执行时间。
作者: 芦曦    时间: 2012-7-13 10:42
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()方法从开始到结束时的运行时间了。

  
}

}
作者: 陈云帆    时间: 2012-7-13 10:46
class TempDemo
{
      public static void main(String[] args)
        {
           SubTime s = new SubTime();
           s.getTime();//这里改掉就OK了,
         }
}

s.runcode();//调用runcode方法只会执行for循环,而不进行计算,因为没有调用getTime。
作者: 王宝康    时间: 2012-7-13 11:33
首先,楼主你的代码中没有声明为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
作者: 灵感    时间: 2012-8-8 08:04
高手真多,受益匪浅




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2