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