|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)
学员明天午时问了我一个风趣的Java编译成绩,我也没法给他注释,不晓得有无途经的高人可以注释分明缘故原由,看不惜见教!
上面程序的main办法中的第二行代码和正文中的两行代码表达的意义完整不异,正文中的两行代码不克不及经由过程编译(这很简单了解),而第二行(接纳办法挪用链)却能够顺遂经由过程编译(这就很难了解了)。
publicclassTest
{
publicvoidfunc()
{
System.out.println("func");
}
publicstaticvoidmain(Stringargs[])throwsException
{
Objectobj=newTest();
//上面这行能够乐成编译
((Test)obj).getClass().newInstance().func();
//上面这两行没法经由过程编译
/*Classc=((Test)obj).getClass();
c.newInstance().func();*/
}
}
感激paulex师长教师的匡助,在paulex师长教师的提醒下,我基础上分明了上述成绩的缘故原由。上面是paulex师长教师的解答:
由于Generic,编译器能够在编译期取得范例信息以是能够编译这类代码。你将上面那两行改成
Class<?extendsTest>c=((Test)obj).getClass();
c.newInstance().func();
应当就可以经由过程编译了。
上面是我在paulex师长教师解答的基本上,对成绩的进一步注释:
在JDK1.5中引进范型后,Object.getClass()办法的界说以下:
publicfinalClass<?extendsObject>getClass()
Returnstheruntimeclassofanobject.ThatClassobjectistheobjectthatislockedbystaticsynchronizedmethodsoftherepresentedclass.
Returns:
Thejava.lang.Classobjectthatrepresentstheruntimeclassoftheobject.TheresultisoftypeClass<?extendsX>whereXistheerasureofthestatictypeoftheexpressiononwhichgetClassiscalled.
这申明((Test)obj).getClass()语句前往的对象范例为Class<?extendsTest>,而Class<T>的newInstance()办法的界说以下:
publicTnewInstance()throwsInstantiationException,IllegalAccessException
即关于编译器看来,Class<Test>的newInstance()办法的对象范例为Test,而((Test)obj).getClass()前往的为对象范例为Class<?extendsTest>,以是,编译器以为((Test)obj).getClass().newInstance()前往的对象范例为Test。
上面这两行代码之以是没法经由过程编译
Classc=((Test)obj).getClass();
c.newInstance().func();
是由于((Test)obj).getClass()前往的为对象范例为Class<?extendsTest>,可是我们在第一即将了局强迫转换成了Class,然后再往挪用Class的newInstance办法,而不是往挪用Class<Test>的newInstance办法,编译器固然不再以为Class的newInstance办法前往的对象为Test了。
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难 |
|