语法糖(Syntactic sugar)
是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
糖1:for-each
功能和传统的fori相似
代码样例
public class Test {
public static void main(String[] args) {
int[] num = new int[10];
for (int i = 0; i < 10; i++) {
num[i] = i;
}
//旧版本
for (int i = 0; i < num.length; i++) {
System.out.print(num[i]+" ");
}
System.out.println();
//新版本
for (int i:num) {
System.out.print(num[i]+" ");
}
}
}
输出对比
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
特性
- for-each从JDK5.0开始引入
- for-each语法更加简洁
- for-each可以避免语法越界错误
- fori可以删除元素,for-each不可以
- for-each遍历时候不知道当前元素的具体位置
- for-each只能正向遍历,不能反向遍历
- for-each不能同时遍历两个集合
糖2:枚举类型
变量的取值只在一个有限的集合里面
代码样例
public class Test {
public static void main(String[] args) {
enum Size{
SMALL,MEDIUM,LARGE;
}
Size s1 = Size.SMALL;
Size s2 = Size.MEDIUM;
Size s3 = Size.LARGE;
Size s4 = Size.SMALL;
System.out.println(s1==s4);
System.out.println(s3==s4);
}
}
输出样例
true
false
特性
- enum声明枚举类,且都是Enum的 子类
- enum内部有多少个值,就有多少个实例对象
- 不能直接new枚举类对象
- 除了枚举的内容 ,还可以添加属性,方法 ,构造函数
- 构造函数只能是private类型,只能内部调用
- enum也继承了Enum的子类,也继承了相应方法
- ordinal()返回枚举值所在的索引位置
- compareTo()比较两个枚举值的索引位置大小
- toString()放回枚举值的字符串表示
- valueOf()将字符串初始化为枚举对象
- values()返回所有的枚举值
糖3:不定项参数
普通函数的形参列表是固定个数/类型/顺序
JDK5.0提供了不定项参数(可变参数)功能
代码样例
public class Test {
public static void main(String[] args) {
test("aaa");
test("aaa","bbb","ccc");
}
public static void test(String... args){
System.out.println(args.length);
for (String arg:args) {
System.out.println(arg);
}
}
}
输出样例
1
aaa
3
aaa
bbb
ccc
特性
- 类型后面加…表示,如代码样例所示
- 可变参数,实际上是一个数组
- 一个方法只能有一个不定项参数,且必须位于参数列表的最后
- 优先规则1:固定参数的方法比可变参数优先级更高
- 优先规则2:调用语句,同时与两个带可变参数的方法匹配,则报错
糖4:静态导入
import导入程序所需要的类
import static导入一个类的静态方法和静态常量(JDK5.0引入)
代码样例
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.System.out;
public class Test {
public static void main(String[] args) {
int a=3,b=4,c=0;
//静态引入
c = (int) sqrt(pow(a,2)+pow(b,2));
//原本用法
c = (int) Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
//静态引入
out.println(c);
//原本用法
System.out.println(c);
}
}
输出样例
5
5
特性
- 可以省略类名,直接用
- 静态方法具有明确特征,如有重名,需要补充类名
- 通配符:*
糖5:自动装箱和拆箱
在java中,基本类型放在栈里面,对象则是在堆里开辟了内存空间,把对象的引用存入栈里面,基本类型可以包含在对象里面,所以形象的形容为装箱
从JDK5.0开始引入,简化了基本类型和对象转化的写法
基本类型:boolean/byte/char/int/short/long/float/doubm[]X[X[o,]X[X[9[yyCBBXX]XXZ[[H\Hh%yB]X[X[[J
Ne&z+%yB]X[[[X[[J
N]]X[X[
K[J
NCBCBOB]B)B[BO+fy yyg.+9yc#9.#ylg.kd9ycOBOkd99kd9ycy"yofy yy#9c&/`9g*9yc#yiz, BOBBL{yc9"yyBσB99ayc9"yyB. y-B]\HHBH\H\]NBXX\\XX[\X]X[X[]]H[J
^[K[H[HNCBCBBXX[\X]X[[[X[^[]X[X[o,]X[X[9[yyCBBXX]XXZ[[H\He&z+%yB]X[X[[J
N]X[[[X[[J
N]]X[X[
K[J
NCBCBOB]B)B[BO)*n9ygfy yy9aykza#zeOBO"yyg.+9yc#9c*9+9ycy/o#9.#ylg.kd9ycOBOkd99kd9ycy"yo"yy#9.g OBOgfy y"yy K9y #:gggfy y"yy9y BOBBLK]\\\BσBn9d%`a9;`o#onkalB n.9f(;]yKXY[[z/c9/B9K]\\\KXY[[y9y/B. y-B]\HHBH\H\]NBXX\\[\[Y[]]XXHB]]H[YHNB\YCBXXJ
H^[[K[al$9bNCBBXX]XXZ[[H\HJ\LH[\\H]\
J^[K[[\\YNH
^[JHK[XX
NCBCBCBBOB]B/-B[OBNBal$9bB[OB)B[BO-a99khyon]]XXyyc#9clyyOBOg*KXgec9d#/&!9iyyOBO)y`k.by.-9y-B\[\\H]\
NBJ\H[\\x)OBO.#yg*:)y`k.by.-9#9cy/oB\[\\H]\
NBJ[\\x)BOBBL\\[y:/oOBσBcc{\\[zn9.N
NKLyyo#oyBc#\\[zn9.N9yo#oyBM;\gBσB]y.cy. 9+.g B*c*9k.by&yl,yk.gB99a\l`:`9OB. y-B]\HHBH\H\]NBXX\\XX]XXZ[[H\H\LHH
N\LHY\LHX[HH
NHY[HX[K[LOOXJN[K[LOXN[K[LXCBCBOB]B/-B[OBYOBYOBYOB[OB)B[BO`o/kfOOBOkd9.c#OOBOy$OBO\c*9g*9l`:`"gg$9df9cOBO\c*9g*YXXo.+OOBOh#n%OBO.#z *9g*9yhc:/nOBOi)*9/&k ym9/d)OBO\c*9+m*;y"yg*9ke y.+yo%yaiy9ayk{.g"y.$y!!9BOBBM{]b!+mBσB9aB. y-B]\HHBH\H\]NBXX\\XX]XXZ[[H\H[[H[[\]
[
^[X\[H]YXI\H\[HI\HXI\HY][I\HLNCBCBCBOB]B.σBb,9i:/l]z+b9),y.,:/9&al9)z+'9c..cy%c"9al#9&.#i&i&+/c. |