语法糖----JAVA
语法糖
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错 的机会;但是这种语法对语言的功能并没有影响。
Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。
泛型
与C#中的泛型相比,Java的泛型可以算是“伪泛型”了。在C#中,不论是在程序源码中、在编译后的中间语言,还是在运行期泛型都是真实存在的。
Java则不同,Java的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型,同时在必要的地方插入了强制转型的代码。
泛型代码:
- public static void main(String[] args) {
- List<String> stringList = new ArrayList<String>();
- stringList.add("oliver");
- System.out.println(stringList.get(0));
- }
将上面的代码的字节码反编译后:
- public static void main(String args[])
- {
- List stringList = new ArrayList();
- stringList.add("oliver");
- System.out.println((String)stringList.get(0));
- }
上面代码可以看出Java中的泛型进行了泛型擦除。
自动拆箱/装箱
自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作。
装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征。
拆箱过程:与装箱过程相反,把包装类型转换成基本类型。
需要注意的是:包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:
- Integer a = 1;
- Integer b = 1;
- Long c = 1L;
- System.out.println(a == b);
- System.out.println(c.equals(a));
循环历遍(foreach)
语法:
- List<Integer> list = new ArrayList<Integer>();
- for(Integer num : list){
- System.out.println(num);
- }
Foreach要求被历遍的对象要实现Iterable接口,由此可想而知,foreach迭代也是调用底层的迭代器实现的。反编译上面源码的字节码:
- List list = new ArrayList();
- Integer num;
- Integer num;
- for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(num)){
- num = (Integer) iterator.next();
- }
条件编辑
很多编程语言都提供了条件编译的途径,C,C++中使用#ifdef。Java语言并没有提供这种预编译功能,但是Java也能实现预编译。
- if(true){
- System.out.println("true");
- }else{
- System.out.println("false");
- }
这段代码的字节码反编译后只有一条语句:
- System.out.println("true");
在编译器中,将会把分支不成立的代码消除,这一动作发生在编译器解除语法糖阶段。
所以说,可以利用条件语句来实现预编译。
枚举
枚举类型其实并不复杂,在JVM字节码文件结构中,并没有“枚举”这个类型。
其实源程序的枚举类型,会在编译期被编译成一个普通了类。利用继承和反射,这是完全可以做到的。
看下面一个枚举类:
- public enum EnumTest {
- OLIVER,LEE;
- }
反编译之后:
- public final class EnumTest extends Enum {
- private EnumTest(String s, int i) {
- super(s, i);
- }
- public static EnumTest[] values() {
- EnumTest aenumtest[];
- int i;
- EnumTest aenumtest1[];
- System.arraycopy(aenumtest = ENUM$VALUES, 0,
- aenumtest1 = new EnumTest[i = aenumtest.length], 0, i);
- return aenumtest1;
- }
- public static EnumTest valueOf(String s) {
- return (EnumTest) Enum.valueOf(EnumTest, s);
- }
- public static final EnumTest OLIVER;
- public static final EnumTest LEE;
- private static final EnumTest ENUM$VALUES[];
- static {
- OLIVER = new EnumTest("OLIVER", 0);
- LEE = new EnumTest("LEE", 1);
- ENUM$VALUES = (new EnumTest[] { OLIVER, LEE });
- }
- }
变长参数
变长参数允许我们传入到方法的参数是不固定个数。
对于这个方法:
- public void foo(String str,Object...args){
- }
我们可以这样使用:
- foo("平林新袖");
- foo("平林新袖",new Object());
- foo("平林新袖",new Integer(1),"hello,平林新袖");
- foo("平林新袖",new ArrayList(),new Object(),true,1);
参数args可以是任意多个。
其实,在编译阶段,args是会被编译成Object [] args。
- public transient void foo(String s, Object aobj[])
- {
- }
这样,变长参数就可以实现了。
但是要注意的是,变长参数必须是方法参数的最后一项。
除了上面介绍的语法糖,还有内部类,断言以及JDK7的switch支持字符串(在编译之后的字节码中,依然是使用的if-else来实现的),自动关闭资源(在try中定义和关闭)等。
无疑,语法糖方便了程序员的开发,提高了开发效率,提升了语法的严谨也减少了编码出错误的几率。我们不仅仅在平时的编码中依赖语法糖,更要看清语法糖背后程序代码的真实结构,这样才能更好的利用它们。
最后--语法糖越甜,程序员越开心,系统越不开心。
[感谢] http://blog.csdn.net/ol_beta/article/details/6787234
语法糖----JAVA的更多相关文章
- java新的语法糖:Java 8 Lambda表达式
***************************************************************************
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- 【Java基础】Java中的语法糖
目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with- ...
- Java语法糖4:内部类
内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- Java中的10颗语法糖
语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...
- 转:【深入Java虚拟机】之六:Java语法糖
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...
- Java 中的语法糖
百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...
- Java的语法糖
1.前言 本文记录内容来自<深入理解Java虚拟机>的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法.词法分析,语义分析和字节码生成的过程等.主要关注 ...
随机推荐
- jmeter 通过ant集成到jenkins
jmeter可以通过ant自动执行测试脚本,然后集成到jenkins上,并发送测试报告 1.下载安装ant 2.将jmeter安装包extras文件夹里ant-jemter-1.1.1.jar 复制到 ...
- win7 64位 Xsheel
Xsheel5安装后,找不到.dll文件,系统支持不好,不用 Xshell4有时提示 1152:Error 就使用 链接:http://pan.baidu.com/s/1c1s42Y0 密码:098x ...
- android 自定义百度地图放大缩小
自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下: 这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态.具体实现如下: zo ...
- ALV列、行、单元格颜色设置
)颜色含义 :海蓝:2:浅清:3:黄色:4:浅蓝:5:青色:6:红色:7:橙色. (1)首位为主颜色: (2)次位为辅助颜色: (3)末位为0时,表示首位数字表为表格的底色: 末位为1时,则表示以1为 ...
- 宣布发布 Windows Azure ExpressRoute,宣告与 Level 3 建立全新的合作伙伴关系并推出关于其他 Azure 服务令人振奋的更新
在我们与世界各地的客户和合作伙伴交谈时,总会听到他们说,希望找到一个提供商帮助他们最大限度地发挥内部部署投资的作用并且能够利用云的灵活性.这是我们构建混合云策略和云操作系统愿景的基本原则.本着我 ...
- HDU 1870 愚人节的礼物
题解:简单的数括号问题…… #include <cstdio> char s[1005]; int main(){ while(scanf("%s",s)!=EOF){ ...
- Laravel + Xdebug 时需要注意的问题
[平台环境]64bit Win7 + Wamp2.5 (php 5.5, Apache 2.4.9) [Xdebug版本]php_xdebug-2.2.5-5.5-vc11-x86_64.dll 配置 ...
- Html.text(转载)
2.Html.ValidationSummary:用来显示ModelState字典中所有验证错误的无序列表,使用布尔值类型参数(true)来告知辅助方法排除属性级别的错误,只显示ModelState中 ...
- ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
1.JS外部文件中U函数不会被解析,内部JS代码可以被解析. 2.halt. _404可以定制错误模板,在配置文件中配置 TMPL_EXCEPTION_FILE =>'./Public/Tpl/ ...
- hive on spark的安装及问题
配置hive hive-site <property> <name>hive.metastore.uris</name> <value>thrift:/ ...