使用Java编一个有意思的_一个有趣的Java编译问题
学员冯伟立今天中午问了我一个有趣的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编译问题相关推荐
- java制作一个应用程序_一个制作java小应用程序的全过程
一个制作java小应用程序的全过程 一.安装java软件: 从网上下载jdk-7u25-windows-i586.exe,安装到C:\Program Files\Java\jdk1.7.0_25. 二 ...
- java 如何循环执行一个对象_一个Java对象到底有多大?
编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知,在我们不经意间,大量的内存被无形地浪费了. 一个Java对象到底有多大 ...
- php数组排序按照另一个数组排序,php,_一个数组根据另一个数组来排序,php - phpStudy...
一个数组根据另一个数组来排序 $a = Array ( Array ( 'cid' => 1, 'cname' => '关于' ), Array ( 'cid' => 7, 'cna ...
- java短横线转驼峰_第二讲:Java的运作原理
对于不同运行的平台,有不同的JVM.JVM屏蔽了底层运行平台的差别.实现了"一次编译,到处运行". 一.Java常用开发工具 编译器 记事本 Notepad++ EditPlus ...
- java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...
小编典典 所有这些线程都属于JVM. 运行jstack 以获取线程列表. "main" #1 prio=5 os_prio=0 cpu=150.00ms elapsed=8.04s ...
- java国际化 英语的标识符_(转)Java 国际化
1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...
- java版我的世界_我的世界Java版1.16
我的世界Java版1.16是我的世界的特殊版本,这个版本的我的世界深受玩家们的喜欢,小编为各位玩家带来了最新的我的世界Java版1.16手机版本,不仅游戏内容在一定程度上丰富十足,画面打造也非常的精美 ...
- java语言开发手机游戏_手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系...
手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...
- java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始
java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...
最新文章
- 请汇编高手注释的CompareText
- 在 Shell 脚本中执行语法检查调试模式
- 服务器向客户端不响应为null的属性(为了便于查询JSON数据)spring.jackson.default-property-inclusion=NON_NULL
- Windows驱动—Windows应用程序和Windows驱动通信编程
- Java回文数的判断与生成
- SQL63 刷题通过的题目排名
- 被平均(统计平均)的陷阱
- Android 性能测试初探(四)
- ExtendSim高效 易学 易用 真正能用起来的系统仿真与优化工具
- 特征值+SVD分解+伪逆(广义逆)
- 「快闪群」批量成交攻略
- CUDA error: device-side assert triggered
- 手机如何把图片转Word文档?使用这种方法非常方便
- 解决chrome浏览器应用商店排版混乱问题
- 阿里云DevOps助理工程师认证题库和笔记(ACA)2021最新
- html5 canvas 椭圆,html5中怎么利用Canvas绘制椭圆
- 论文笔记(三):PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes
- 如何使用 Java Servlet 处理 HTML 表单数据
- html网页设计期末大作业——化妆品html+div商城(19页)
- 团灭了3个月的线下营销,还有希望吗?
热门文章
- 新乡学院2019计算机报名,新乡学院2019年招生章程
- java 判断date为空_java – 如何检查JSONArray元素是否为空
- android 模块混淆配置,使用android studio混淆多个模块
- oracle 添加默认值列,Oracle 11g增加列,并带默认值的新特性
- c语言printf输出中文报错,printf输出中文后还带有数字是怎么回事?
- vfp报表纸张设置_JimuReport积木报表 — API数据源报表制作
- JAVA如何选中一行上移,怎么把表格一行整体上移
- Cron 触发器及相关内容 (第一部分)
- windows系统下maven环境搭建
- asynchttpclient学习