Java语法糖(一)
概述
语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会。
解语法糖发生在Java源码被编译成Class字节码的过程中,还原回简单的基础语法结构。
语法糖之一:泛型(Generics)
Java中的泛型又称为类型擦除,它只在Java源码中存在,被编译成字节码后,就已经替换为原生类型了,并在相应的地方加入强制类型转换。
例如:
public class GenericTypes {
/*
* 两个mothod1方法不能被编译,因为List<Integer>和List<String>被编译成class文件后都被擦除了,
* 变成了一样的原生类型List<T>,擦除之后两个方法的签名一样。
*/
public static void mothod1(List<Integer> list) { }
public static void mothod1(List<String> list) { } /*
* 在jdk1.7
* 两个mothod2方法不能被编译,因为List<Integer>和List<String>被编译成class文件后都被擦除了,
* 变成了一样的原生类型List<T>,擦除之后两个方法的签名一样。返回值不参与重载选择
*
* Sun JDK1.6中Javac才能编译成功
* 在Class文件格式中,只要描述符不是完全一致的两个方法就可以共存。
*/
public static String mothod2(List<String> list) {
return "";
}
public static Integer mothod2(List<Integer> list) {
return 1;
}
}
语法糖之二:自动拆箱和装箱、Foreach、变长参数
例如:
public class Foreach_Varargs {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);//变长参数(Varargs)
int sum = 0;
for(int i : list) { //遍历循环Foreach
sum += i;
}
System.out.println(sum);
}
/*
* 反编译之后的代码
* 1、变长参数还原为数组类型的参数:Arrays.asList(...) ----> new Integer[]{...}
* 2、Foreach还原为迭代器实现
* 3、自动拆箱和装箱还原为Integer.valueOf()和Integer.intValue()方法
*
public static void main(String[] args) {
java.util.List<Integer> list = java.util.Arrays.asList(new Integer[] {
Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3),
Integer.valueOf(4) });
int sum = 0;
for (Iterator localIterator = list.iterator(); localIterator.hasNext();) {
int i = ((Integer) localIterator.next()).intValue();
sum += i;
}
System.out.println(sum);
}
*/
}
一个更复杂的自动装箱拆箱的栗子:
public class Autoboxing {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d); //(1)
System.out.println(e == f); //(2)
System.out.println(c == (a + b)); //(3)
System.out.println(c.equals(a + b)); //(4)
System.out.println(g == (a + b)); //(5)
System.out.println(g.equals(a + b)); //(6)
}
/*
* 反编译后的代码
*
* 包装类的“==”运算在不遇到算数运算的情况下不会自动拆箱;
* equals方法不处理数据转型的关系。
*
* 在 Java 中,== 比较的是对象引用,而 equals 比较的是值。
*
* 一、(1)为true,(2)为false原因:
* IntegerCache:把-128到127(可调)的整数都提前实例化了,不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象;
* 用来节省内存和提高性能。这种 Integer缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。
* 这个缓存会在 Integer 类第一次被使用的时候被初始化出来.是什么原因选择这个 -128 到 127 这个范围呢?因为这个范围的整数值是使用最广泛的。
* Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行
*
* 不在缓存范围的会新new Integer对象。
* 二、(3)为true,(5)为true
* 自动拆箱,相当于数值类型int
* 三、(4)为true
* a,b先拆箱计算数值和,再将计算结果装箱为Integer
* 四、(5)为false
* g为Long类型,a + b为Integer,类型不一致
* 五、(6)为false, g为Long类型,a + b为Integer,类型不一致,返回false
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
*
public class Autoboxing {
public static void main(String[] args) {
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.intValue() == a.intValue() + b.intValue());
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == (long)(a.intValue() + b.intValue()));
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
}
}
*/
}
语法糖之三:条件编译
栗子:
public class ifdef {
public static void main(String[] args) {
final boolean isCompile = true;
if(isCompile) {
System.out.println("11111");
} else {
System.out.println("2222");
}
}
/*
* 条件编译
* System.out.println("2222"); 不会编译
* Java只能实现语句基本块级别的条件编译,而无法实现根据条件调整整个Java类的结构。
*
* 反编译后的代码:
* public class ifdef {
public static void main(String[] args) {
boolean isCompile = true;
System.out.println("11111");
}
}
*/
}
除以上外,语法糖还有:内部类、枚举类、断言语句、对枚举和字符串的switch支持(1.7)、try语句中定义和关闭资源(1.7)等,接下来继续Java语法糖系列。
Java语法糖(一)的更多相关文章
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- java语法糖---枚举
java语法糖---枚举 在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...
- Java语法糖(二)
语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...
- Java语法糖4:内部类
内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...
- 转:【深入Java虚拟机】之六:Java语法糖
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...
- 早期(编译器)优化--Java语法糖的味道
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...
- Java 语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...
- JVM总结-Java语法糖与Java编译器
自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装 ...
随机推荐
- Mysql--子查询、分页查询、联合查询
一. 子查询的定义 出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句. 外部查询:select.inser ...
- IDEA整合Mybatis+Struts2+Spring(一)--新建项目
1.IDEA新建Maven项目: (1)依次点击File->New->Project,弹出如下对话框: (2)在弹出的New Project页面上,①选择Maven,② 勾选Create ...
- linux正则表达式扩展部分
扩展的正则表达式(Extended Regular Expressions): 使用的命令为:grep -E以及egrep [了解即可] 1)+ 表示重复“一个或一个以上”前面的字符(*是0或多 ...
- 【CodeBase】PHP转换编码,读写文件/网页内容的防乱码方法
核心代码: //检查字符串的编码 $charset=mb_detect_encoding($doc,['ASCII','GB2312','GBK','BIG5','UTF8'],TRUE); //字符 ...
- java util - Hex转换工具
测试代码 package cn.java.codec.hex; public class Test { public static void main(String[] args) { String ...
- [译]The Python Tutorial#3. An Informal Introduction to Python
3. An Informal Introduction to Python 在以下示例中,输入和输出以提示符(>>>和...)的出现和消失来标注:如果想要重现示例,提示符出现时,必须 ...
- python PEP8代码规范及问题
最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代码规范,下面是过程中报出的警告及解决方法,英文有些翻译不太准确见谅,会不断更新: PEP 8: module level i ...
- 笔记-python-standard library-9.6 random
笔记-python-standard library-9.6 random 1. random source code:Lib/random.py 1.1. functions for ...
- DiyCode开源项目 TopicActivity 分析
1.首先看看TopActivity效果. 2.TopicActivity是一个继承BaseActivity的.前面分析过BaseActivity了.主要有一个标题栏,有返回的图标. 3.贴一下T ...
- android json 解析 kotlin
前面 写了一次 kotlin解析json 但是,真的写得太烂,直接删掉了,现在重新整理一下.顺便记录一下今天坑了我很久的小问题. 1.首先从最简单的入手吧 一个json的字符串:=====就叫做jso ...