学员冯伟立今天中午问了我一个有趣的Java编译问题,我也无法给他解释,不知道有没有路过的高人能够解释清楚原因,望不吝赐教!

下面程序的main方法中的第二行代码和注释中的两行代码表达的意思完全相同,注释中的两行代码不能通过编译(这很容易理解),而第二行(采用方法调用链)却可以顺利通过编译(这就很难理解了)。

public class Test

{

public void func()

{

System.out.println("func");

}

public static void main(String args[]) throws Exception

{

Object obj = new Test();

//下面这行可以成功编译

((Test)obj).getClass().newInstance().func();

//下面这两行无法通过编译

/*Class c = ((Test)obj).getClass();

c.newInstance().func(); */

}

}

感谢paulex先生的帮助,在paulex先生的提示下,我基本上明白了上述问题的原因。下面是paulex先生的解答:

-----------------------------------------------------------------------------------------------------------------------

paulex 发表于2006-11-08 08:09:00  IP: 10.0.0.*

因为Generic, 编译器可以在编译期获得类型信息所以可以编译这类代码。你将下面那两行改成

Class extends Test> c = ((Test)obj).getClass();

c.newInstance().func();

应该就能通过编译了。

楼上的用1.4.2的编译器所以不能编译。

-------------------------------------------------------------------------------------------------------------------------

下面是我在paulex先生解答的基础上,对问题的进一步解释:

在JDK 1.5中引入范型后,Object.getClass()方法的定义如下:

public final Class extends Object> getClass()

Returns the runtime class of an object. That Class object is the object that is locked by static synchronized methods of the represented class.

Returns:The java.lang.Class object that represents the runtime class of the object. The result is of type Class extends X> where X is the erasure of the static type of the expression on which getClass is called.

这说明((Test)obj).getClass()语句返回的对象类型为Class extends Test>,而Class的newInstance()方法的定义如下:

public T newInstance() throws InstantiationException,IllegalAccessException

即对于编译器看来,Class的newInstance()方法的对象类型为Test,而((Test)obj).getClass()返回的为对象类型为Class extends Test>,所以,编译器认为((Test)obj).getClass().newInstance()返回的对象类型为Test。

下面这两行代码之所以无法通过编译

Class c = ((Test)obj).getClass();

c.newInstance().func();

是因为((Test)obj).getClass()返回的为对象类型为Class extends Test>,但是我们在第一行将结果强制转换成了Class,然后再去调用Class的newInstance方法,而不是去调用Class的newInstance方法,编译器当然不再认为Class的newInstance方法返回的对象为Test了。

-------------------------------------------------------

再次向paulex先生表示感谢,paulex先生的blog地址是http://blog.csdn.net/paulex

使用Java编一个有意思的_一个有趣的Java编译问题相关推荐

  1. java制作一个应用程序_一个制作java小应用程序的全过程

    一个制作java小应用程序的全过程 一.安装java软件: 从网上下载jdk-7u25-windows-i586.exe,安装到C:\Program Files\Java\jdk1.7.0_25. 二 ...

  2. java 如何循环执行一个对象_一个Java对象到底有多大?

    编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知,在我们不经意间,大量的内存被无形地浪费了. 一个Java对象到底有多大 ...

  3. php数组排序按照另一个数组排序,php,_一个数组根据另一个数组来排序,php - phpStudy...

    一个数组根据另一个数组来排序 $a = Array ( Array ( 'cid' => 1, 'cname' => '关于' ), Array ( 'cid' => 7, 'cna ...

  4. java短横线转驼峰_第二讲:Java的运作原理

    对于不同运行的平台,有不同的JVM.JVM屏蔽了底层运行平台的差别.实现了"一次编译,到处运行". 一.Java常用开发工具 编译器 记事本 Notepad++ EditPlus ...

  5. java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...

    小编典典 所有这些线程都属于JVM. 运行jstack 以获取线程列表. "main" #1 prio=5 os_prio=0 cpu=150.00ms elapsed=8.04s ...

  6. java国际化 英语的标识符_(转)Java 国际化

    1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...

  7. java版我的世界_我的世界Java版1.16

    我的世界Java版1.16是我的世界的特殊版本,这个版本的我的世界深受玩家们的喜欢,小编为各位玩家带来了最新的我的世界Java版1.16手机版本,不仅游戏内容在一定程度上丰富十足,画面打造也非常的精美 ...

  8. java语言开发手机游戏_手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系...

    手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  9. java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始

    java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...

最新文章

  1. 请汇编高手注释的CompareText
  2. 在 Shell 脚本中执行语法检查调试模式
  3. 服务器向客户端不响应为null的属性(为了便于查询JSON数据)spring.jackson.default-property-inclusion=NON_NULL
  4. Windows驱动—Windows应用程序和Windows驱动通信编程
  5. Java回文数的判断与生成
  6. SQL63 刷题通过的题目排名
  7. 被平均(统计平均)的陷阱
  8. Android 性能测试初探(四)
  9. ExtendSim高效 易学 易用 真正能用起来的系统仿真与优化工具
  10. 特征值+SVD分解+伪逆(广义逆)
  11. 「快闪群」批量成交攻略
  12. CUDA error: device-side assert triggered
  13. 手机如何把图片转Word文档?使用这种方法非常方便
  14. 解决chrome浏览器应用商店排版混乱问题
  15. 阿里云DevOps助理工程师认证题库和笔记(ACA)2021最新
  16. html5 canvas 椭圆,html5中怎么利用Canvas绘制椭圆
  17. 论文笔记(三):PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes
  18. 如何使用 Java Servlet 处理 HTML 表单数据
  19. html网页设计期末大作业——化妆品html+div商城(19页)
  20. 团灭了3个月的线下营销,还有希望吗?

热门文章

  1. 新乡学院2019计算机报名,新乡学院2019年招生章程
  2. java 判断date为空_java – 如何检查JSONArray元素是否为空
  3. android 模块混淆配置,使用android studio混淆多个模块
  4. oracle 添加默认值列,Oracle 11g增加列,并带默认值的新特性
  5. c语言printf输出中文报错,printf输出中文后还带有数字是怎么回事?
  6. vfp报表纸张设置_JimuReport积木报表 — API数据源报表制作
  7. JAVA如何选中一行上移,怎么把表格一行整体上移
  8. Cron 触发器及相关内容 (第一部分)
  9. windows系统下maven环境搭建
  10. asynchttpclient学习