语法糖

语法糖(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. tornado模板的自动编码问题(autoescape )

    tornado新版(具体版本未知)支持自动转义,比如{{ "<div>" }}不会输出html标签,而是进行转义. {{ module.test(10) }} 也会进行 ...

  2. 原型扩展的方法解决IE和Firefox的Js兼容问题

    if(!document.all){//textContent->text    Element.prototype.__defineGetter__('text',function(){ret ...

  3. Spring RESTful服务接收和返回JSON最佳实践

    http://blog.csdn.net/prince_hua/article/details/12103501

  4. find the most comfortable road(并差集,找差值最小的权值)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. artdialog的图片,标题,以及关闭按钮不显示的问题

    因其它css样式文件中包含“div{ overflow:hidden; }”引起的artdialog的图片,标题,以及关闭按钮不显示的问题: 如下图: 解决办法:在artdialog的样式文件顶部添加 ...

  6. ASP.NET中IsPostBack的理解

    IsPostBack是Page类的一个属性,返回值为一个布尔值. 一般放在Page_Load事件中, 是指是否第一次调用这个页面.当页面是第一次打开时其值为False,若当前页面为一个提交后的页面其值 ...

  7. .net 中实现php rawurlencode方法(RFC3986)

    在对接api时候,经常需要对字符串进行各种编码处理,系统可能是异构的,实现语言也就可能是不一样的.所以经常会使人犯一些2B的错误! 比如:php实现的api中用了rawurlencode,文档中写,需 ...

  8. Android中利用httpclient进行网络通信的方法(以用户登录为例说明)

    http://www.android100.org/html/201406/09/22915.html 1.服务器端 服务器端和android没有太大关系,对J2EE比较熟悉的话写起来应该很容易,这里 ...

  9. 关于Ubuntu12.04下code::blocks不能使用debug解决方法

    问题描述:   系统:ubuntu 12.04   code::blocks版本:10.05   问题现象:debug->start        之后出现:warning: GDB: Fail ...

  10. Nginx小技巧(一)隐藏版本号

    修改nginx.conf server_tokens作用域是http server location语句块 server_tokens默认值是on,表示显示版本信息,设置server_tokens值是 ...