|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱.
因为我们在上溯外型(在承继布局中向上挪动)时代丧失了详细的范例信息,以是为了猎取详细的范例信息——亦即在分级布局中向下挪动——我们必需利用“下溯外型”手艺。但是,我们晓得一个上溯外型一定是平安的;基本类不成能再具有一个比衍生类更年夜的接口。因而,我们经由过程基本类接口发送的每条动静都一定可以吸收到。但在举行下溯外型的时分,我们(举个例子来讲)其实不真的晓得一个多少外形实践是一个圆,它完整多是一个三角形、方形大概其他外形。
<br>
为办理这个成绩,必需有一种举措可以包管下溯外型准确举行。只要如许,我们才不会贸然外型成一种毛病的范例,然后收回一条对象不成能收到的动静。如许做长短常不平安的。
在某些言语中(如C++),为了举行包管“范例平安”的下溯外型,必需接纳特别的操纵。但在Java中,一切外型城市主动失掉反省和核实!以是即便我们只是举行一次一般的括弧外型,进进运转期今后,仍旧会毫无包涵地对这个外型举行反省,包管它切实其实是我们但愿的那品种型。假如不是,就会失掉一个ClassCastException(类外型背例)。在运转时代对范例举行反省的举动叫作“运转期范例标识”(RTTI)。上面这个例子向人人演示了RTTI的举动:
- //:RTTI.java
- //Downcasting&Run-TimeType
- //Identification(RTTI)
- importjava.util.*;
- classUseful{
- publicvoidf(){}
- publicvoidg(){}
- }
- classMoreUsefulextendsUseful{
- publicvoidf(){}
- publicvoidg(){}
- publicvoidu(){}
- publicvoidv(){}
- publicvoidw(){}
- }
- publicclassRTTI{
- publicstaticvoidmain(String[]args){
- Useful[]x={
- newUseful(),
- newMoreUseful()
- };
- x[0].f();
- x[1].g();
- //Compile-time:methodnotfoundinUseful:
- //!x[1].u();
- ((MoreUseful)x[1]).u();//Downcast/RTTI
- ((MoreUseful)x[0]).u();//Exceptionthrown
- }
- }///:~
复制代码
和在表示图中一样,MoreUseful(更有效的)对Useful(有效的)的接口举行了扩大。但因为它是承继来的,以是也能上溯外型到一个Useful。我们可看到这会在对数组x(位于main()中)举行初始化的时分产生。因为数组中的两个对象都属于Useful类,以是可将f()和g()办法同时发给它们两个。并且假设试图挪用u()(它只存在于MoreUseful),就会收到一条编译期堕落提醒。
若想会见一个MoreUseful对象的扩大接口,可试着举行下溯外型。假如它是准确的范例,这一举动就会乐成。不然,就会失掉一个ClassCastException。我们不用为这个背例编写任何特别的代码,由于它指出的是一个大概在程序中任何中央产生的一个编程毛病。
RTTI的意义远不单单反应在外型处置上。比方,在试图下溯外型之前,可经由过程一种办法懂得本人处置的是甚么范例。全部第11章都在报告Java运转期范例标识的各个方面。
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。 |
|