语法糖

语法糖(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的更多相关文章

  1. java新的语法糖:Java 8 Lambda表达式

    ***************************************************************************

  2. Java语法糖设计

    语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...

  3. 【Java基础】Java中的语法糖

    目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with- ...

  4. Java语法糖4:内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  5. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  6. Java中的10颗语法糖

    语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...

  7. 转:【深入Java虚拟机】之六:Java语法糖

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...

  8. Java 中的语法糖

    百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...

  9. Java的语法糖

    1.前言 本文记录内容来自<深入理解Java虚拟机>的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法.词法分析,语义分析和字节码生成的过程等.主要关注 ...

随机推荐

  1. 微信开发_微信教程__微信通讯框架V1.0

    做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...

  2. MYSQL异常和错误机制

    BEGIN ; ; ; START TRANSACTION; call put_playerbehavior(i_playerid,i_gameid,i_channelid,i_acttime,@a) ...

  3. KISSY对vm的抽取

    vm <script type="text/javascript"> KISSY.use(['bops/js/forced-closure', 'common/js/t ...

  4. 通往WinDbg的捷径

    通往WinDbg的捷径(一) 原文:http://www.debuginfo.com/articles/easywindbg.html译者:arhat时间:2006年4月13日关键词:CDB WinD ...

  5. [转]WIBKIT技术资料

    WebKit结构和流程分析 http://inedx.blog.hexun.com/28830354_d.html webkit架构 http://inedx.blog.hexun.com/28795 ...

  6. jdbc操作步骤和preparedStatment相比Statment的好处

    java操纵数据库封装了一组API,通过这组API可以透明的操作各种数据库,一般来讲,操纵数据库的步骤是: 一. try{ 1.加载数据库驱动 Class.forName("数据库驱动类&q ...

  7. Unity5.0 RPG角色扮演历险类游戏之 森林历险记

    http://v.youku.com/v_show/id_XMTI1MjEyNjc4MA==.html? from=y1.7-1.2

  8. Objective-c 类实现 (@implementation)

    在用@interface声明类之后,可以使用@implementation进行实类的实现.类的实现的具体语法如下: @implementation 类名 方法实现代码; @end; 实例: @impl ...

  9. css精灵(css script 技术)

    上班差不多有15天了,感觉每天都有写不完的也页面,每天都有不同的东西需要学习进步,很充实哦.今天接触到css精灵这个东西.其实之前有看过这种技术,但是没有操作过,只是听说这个技术很强大,能干嘛干嘛,但 ...

  10. JavaSE学习总结第10天_面向对象5

      10.01 运动员和教练案例分析 教练和运动员案例:运动员分乒乓球运动员和篮球运动员,教练分乒乓球教练和篮球教练.为了出国交流,跟乒乓球相关的人员都需要学习英语. 分析: 10.02 运动员和教练 ...