转自:http://blog.csdn.net/ol_beta/article/details/6787234
http://www.cnblogs.com/sunshinewu85/archive/2011/07/20/2111187.html
语法糖(Syntactic Sugar),也叫糖衣语法
指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。(伪语法)
Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。
泛型
与C#中的泛型相比,Java的泛型可以算是“伪泛型”了。在C#中,不论是在程序源码中、在编译后的中间语言,还是在运行期泛型都是真实存在的。
Java则不同,Java的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型,同时在必要的地方插入了强制转型的代码。
泛型代码:
-
import java.util.*;
-
-
public class Test
-
{
-
public static void main(String[] args){
-
List<String> list = new ArrayList<String>();
-
list.add("hello1");
-
System.out.println(list.get(0));
-
}
-
}
将上面的代码的字节码反编译后:
-
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
-
// Jad home page:
-
// Decompiler options: packimports(3)
-
// Source File Name: Test.java
-
-
import java.io.PrintStream;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
public class Test
-
{
-
-
public Test()
-
{
-
}
-
-
public static void main(String args[])
-
{
-
ArrayList arraylist = new ArrayList();
-
arraylist.add("hello1");
-
System.out.println((String)arraylist.get(0));
-
}
-
}
枚举
枚举类型其实并不复杂,在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 });
-
}
-
}
至于更多细节,可以参考父类Enum。
阅读(1876) | 评论(0) | 转发(0) |