百度百科对语法糖的定义

  语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

  Java中的语法糖也是新增了一些语法,使得程序员使用更加方便。但是计算机底层还是使用基本语法来实现的。下面我们讨论几个经常使用到的语法糖,可变参数自动装箱/拆箱增强for循环

可变参数

  没有可变参数时,我们使用同样功能的方法需要对该方法进行重载。将会有大量的重复代码,违反DRY(Don't repeat yourself)原则。但是有了可变参数我们可以传入不同个数的参数,调用同一个方法。

源代码:

public class VarialbeArgumentsDemo {
public static void doWork(int... a) {//可变参数
System.out.println("同一个功能!");
}
public static void main(String[] args) {
doWork(1);
doWork(1,2,3);//不同个数的参数,调用的同一个方法
}
}
输出结果:
    同一个功能!
    同一个功能!

将该文件的字节码反编译得到的代码:

public class VarialbeArgumentsDemo{
public static void doWork(int... a) {
System.out.println("������������");
} public static void main(String[] args){
doWork( new int[] { 1 });
doWork(new int[] { 1, 2, 3 });//计算机底层用数组来实现,可变参数的传递
}
}

我们发现可变参数的实质就是数组传参。

自动装箱\拆箱

  Java中有8种基本数据类型,它们不是对象。所以没有对应的方法,无法区分‘0’和‘NULL’,操作起来不方便,所以Java将它们封装成对象Byte、Short、Integer、Long、 Character、Float、Double、Boolean,并给出相应的方法。我们把一个基本数据类型赋给封装类对象,需要进行类型转换,而把一个封装类对象赋给一个基本数据类型需要解析。我们把这两个过程分别称为,装箱和拆箱。

  由于这两个操作经常要使用,装/拆操作繁琐而没有难度,所以Java就给出了自动装/拆箱操作,我们用Integer讨论,其它的7种一样。

源代码:

public class Test {

    public static void main(String[] args) {
Integer num1 = 123;//将一个基本数据类型赋给Integer对象
int num2 = num1;//将一个Integer对象赋给整形变量
}
}

将该文件的字节码反编译得到的代码:

public class Test{
public static void main(String[] args) {
Integer num1 = Integer.valueOf(123);//装箱操作
int num2 = num1.intValue();//拆箱操作
}
}

计算机底层依然是手动装箱拆箱。

增强for循环

  增强for循环(foreach),让我们对数组和Iterator实例便利更加方便。语法格式:for(数据类型 类型名 : 数组名/Iterator实例名){}

我们用增强for循环对整型数组进行遍历。

源代码:

public class Test {

    public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
for (int ele : arr) {//对arr进行遍历输出
System.out.print(ele);
}
}
}

将该文件的字节码反编译得到的代码:

public class Test
{
  public static void main(String[] args) {
    int[] arr = { 1, 2, 3, 4, 5 };
    int[] arrayOfInt1;
    int j = (arrayOfInt1 = arr).length;//将原来的数组拷贝一份,防止破坏原有数据
    for (int i = 0; i < j; i++) {
      int ele = arrayOfInt1[i];
      System.out.print(ele);
    }
  }
}

增强for循环在底层依旧使用的for循环

============================================

语法糖就是为了让某些固定格式的操作简化,程序员更方便,从而实现高效编程。

Java中的语法糖还有很多条件编译、内部类、枚举类、泛型等等。

Java 中的语法糖的更多相关文章

  1. [转]谈谈Java中的语法糖

    *该博客转自 http://blog.csdn.net/danchu/article/details/54986442 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某 ...

  2. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  3. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

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

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

  5. Java中的语法糖

    一.范型 1. C#和Java范型的区别 在C#中范型是切实存在的,List<int>和List<String>就是两种不同的类型,它们在系统运行期间生成,有自己的虚方法表和类 ...

  6. Java 中的语法糖(7/15整个周六上午总结)

    语法糖定义指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动 ...

  7. Java 中的语法糖,真甜。

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱 ...

  8. Java初认识--Java中的语法结构

    Java中的语法结构(程序流程控制) Java的语法结构有四种: 1.顺序结构. 顺序结构很简单,就是按顺序执行,输出就可以了. 2.判断结构. 判断结构的一个代表性的语句是if:if语句有三种格式体 ...

  9. 看看C# 6.0中那些语法糖都干了些什么(终结篇)

    终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...

随机推荐

  1. 网络唤醒原理浅析(Wake On LAN)

    之前我的一篇文章<网络唤醒全攻略(Wake On Lan)>介绍过如何设置远程唤醒电脑,着重于使用,这篇主要从原理方面解析一下当中的奥妙: 原理 将唤醒魔术包发送的被唤醒机器的网卡上,魔术 ...

  2. for 循环语句

    for循环写在<script></script>里面. for(初始条件:循环条件:状态改变){循环内容} 关键词:break:结束此次循环,continue:跳过此次循环,继 ...

  3. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  4. 安装sklearn过程

    sklearn是scikit-learn的简称,诸多python工具包都需要这个库 安装顺序: wheel numpy scipy sklearn 因为这个库一直安装不好,都没有动力继续深造机器学习了 ...

  5. Java中 Comparator接口 与Comparable 的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...

  6. oracle锁表问题解决方法

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp52 Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程 ...

  7. [转载]Linux shell中的竖线(|)——管道符号

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  8. 4th-结对编程2

    0x00 Coding Coding地址/小伙伴的博客地址 合作伙伴:庞伊凡(201421123011).赵娅汀(201421123012) 0x01 题目描述 上一周大家为四则运算程序设计了2-3个 ...

  9. 团队作业4——第一次项目冲刺(Alpha版本)3rd day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 界面已初步完成并能够进行简单的界面关联 界面内的功能正在完善 2.登陆方面 QQ授权已申请,等待通过 申请通过后在登 ...

  10. 201521123079《java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...