Chinaunix首页 | 论坛 | 博客
  • 博客访问: 899414
  • 博文数量: 453
  • 博客积分: 7865
  • 博客等级: 少将
  • 技术积分: 5673
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-29 16:21
个人简介

时光荏苒..

文章分类
文章存档

2015年(46)

2014年(22)

2013年(68)

2012年(218)

2011年(99)

分类: Java

2014-12-09 14:13:06

转自: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的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型,同时在必要的地方插入了强制转型的代码。
泛型代码:

点击(此处)折叠或打开

  1. import java.util.*;

  2. public class Test
  3. {
  4.     public static void main(String[] args){
  5.         List<String> list = new ArrayList<String>();
  6.         list.add("hello1");
  7.         System.out.println(list.get(0));
  8.     }
  9. }
将上面的代码的字节码反编译后:

点击(此处)折叠或打开

  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
  2. // Jad home page:
  3. // Decompiler options: packimports(3)
  4. // Source File Name: Test.java

  5. import java.io.PrintStream;
  6. import java.util.ArrayList;
  7. import java.util.List;

  8. public class Test
  9. {

  10.     public Test()
  11.     {
  12.     }

  13.     public static void main(String args[])
  14.     {
  15.         ArrayList arraylist = new ArrayList();
  16.         arraylist.add("hello1");
  17.         System.out.println((String)arraylist.get(0));
  18.     }
  19. }

枚举
       枚举类型其实并不复杂,在JVM字节码文件结构中,并没有“枚举”这个类型。
       其实源程序的枚举类型,会在编译期被编译成一个普通了类。利用继承和反射,这是完全可以做到的。
       看下面一个枚举类:

点击(此处)折叠或打开

  1. public enum EnumTest {
  2.     OLIVER,LEE;
  3. }
反编译字节码后:

点击(此处)折叠或打开

  1. public final class EnumTest extends Enum {

  2.     private EnumTest(String s, int i) {
  3.         super(s, i);
  4.     }

  5.     public static EnumTest[] values() {
  6.         EnumTest aenumtest[];
  7.         int i;
  8.         EnumTest aenumtest1[];
  9.         System.arraycopy(aenumtest = ENUM$VALUES, 0,
  10.                 aenumtest1 = new EnumTest[i = aenumtest.length], 0, i);
  11.         return aenumtest1;
  12.     }

  13.     public static EnumTest valueOf(String s) {
  14.         return (EnumTest) Enum.valueOf(EnumTest, s);
  15.     }

  16.     public static final EnumTest OLIVER;
  17.     public static final EnumTest LEE;
  18.     private static final EnumTest ENUM$VALUES[];

  19.     static {
  20.         OLIVER = new EnumTest("OLIVER", 0);
  21.         LEE = new EnumTest("LEE", 1);
  22.         ENUM$VALUES = (new EnumTest[] { OLIVER, LEE });
  23.     }
  24. }
至于更多细节,可以参考父类Enum。








阅读(1834) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~