|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。多态是面向对象的最次要的特征之一,是一种办法的静态绑定,完成运转时的范例决意对象的举动。多态的体现情势是父类指针或援用指向子类对象,在这个指针上挪用的办法利用子类的完成版本。多态是IOC、模板形式完成的关头。
在C++中经由过程虚函数表的体例完成多态,每一个包括虚函数的类都具有一个虚函数表(virtualtable),在这个类对象的地点空间的最靠前的地位存有指向虚函数表的指针。在虚函数表中,依照声明按次顺次分列一切的虚函数。好比:
- classBase{
- public:
- virtualvoidf(){
- printf("Base::f()");
- }
- virtualvoidg(){
- printf("Base::g()");
- }
- };
- classDerived:publicBase{
- public:
- virtualvoidf(){
- printf("Derived::f()");
- }
- };
下面代码对应的类结构:
<br>
因为C++在运转时其实不保护范例信息,以是在编译时间接在子类的虚函数表中将被子类重写的办法交换失落,如上图的Derived::f(),这个办法会被放到虚函数表华夏来父函数在的地位。因为在编译时就断定了虚函数在虚表中的下标,以是在举行虚函数挪用时,间接依据下标举行会见。好比,挪用Derived对象上的f():
- Base*b=newDerived;
- b->f();
在挪用b->f()时,外部会转化成(*b->vptr[1])(),因为虚函数表必要完成RTII,以是虚函数表的第一个slot寄存的是typeinfo,虚函数下标从1入手下手。实践上,虚函数表纪录了这个类的一切虚函数的详细完成(就是在运转时切实要挪用的),编译时就能够断定,不必要静态查找,效力较高。
而Java中,在运转时会保持范例信息和类的承继系统。每个类会在办法区中对应一个数据布局用于寄存类的信息,能够经由过程Class对象会见这个数据布局。个中,范例信息具有superclass属性唆使了其超类,和这个类对应的办法表(个中只包括这个类界说的办法,不包含从超类承继来的)。而每个在堆上创立的对象,都具有一个指向办法区范例信息数据布局的指针,经由过程这个指针能够断定对象的范例。
JVM顶用于办法挪用的指令包含:
invokevirtual:用于挪用实例办法,会依据对象的实践范例举行挪用。
invokespecial:必要特别处置的实例办法,好比:publicfinal办法、公有办法和父类办法等。挪用的办法取决于援用的范例。
invokeinterface:挪用接口的办法。
invokestatic:挪用类办法。
依照下面形貌,关于子类掩盖父类的办法,编译后,挪用指令应当是invokevirtual,挪用的办法取决于对象的范例。invokevirtual办法查找的完成体例是:
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。 |
|