非常本质的问题,极难,代码增加了注释很好看懂,对JVM没有兴趣就不用进来看了
import java.util.*;
class OrgClass
{
//只所以是空函数是为了减少其它时间的影响,你可以在里面加上一些语句看看
void funEmpty(){}
};
class MidClass extends OrgClass
{
void funEmpty(){}
};
class EndClass extends MidClass
{
//main中调用的funEmpty应该都是这个函数
void funEmpty(){}
};
class MyFunCall
{
public static void main(String[] args)
{
/*objEnd,objOrg,objMid指向同一个EndClass类型的对象
(我们称呼它THEOBJ),我们知道其实这三个变量的本质是引用*/
EndClass objEnd = new EndClass();
OrgClass objOrg = (OrgClass)objEnd;
MidClass objMid = (MidClass)objEnd;
//为了说明问题,设置了一个循环,以尽量消除其它线程的影响
for(int outCyc = 0;outCyc<10;outCyc++)
{
//使用objOrg来调用THEOBJ的方法,并计算调用10000000次的时间
long begin1 = System.currentTimeMillis();
for(long i = 0;i<10000000;i++)
objOrg.funEmpty();
long end1 = System.currentTimeMillis();
System.out.println("From objOrg,timespan is:" + (end1-begin1));
//使用objMid来调用同样的方法,同样是10000000次
long begin2 = System.currentTimeMillis();
for(long i = 0;i<10000000;i++)
objMid.funEmpty();
long end2 = System.currentTimeMillis();
System.out.println("From objMid,timespan is:" + (end2-begin2));
//使用objEnd来调用同样的方法,同样是10000000次
long begin3 = System.currentTimeMillis();
for(long i = 0;i<10000000;i++)
objEnd.funEmpty();
long end3 = System.currentTimeMillis();
System.out.println("From objEnd,timespan is:" + (end3-begin3));
System.out.println("");
}
}
}