一马平川
不积跬步无以至千里,后继才能薄发

Java语法糖

2020年02月08日
0
未分类

Java 语法糖

1. switch支持String和枚举

在jdk1.7后,switch支持String和枚举,在这之前switch只支持int、char、short、byte以及其包装类Integer、Character、Short、Byte;char则转换为ascII码值就行匹配,实际还是转换为java基本类型。

switch在处理String和枚举类时,实际上调用了hashcode()和equal()方法进行匹配,hashcode()方法将类型转换为int,而由于哈希存在碰撞的可能性,还需要进行一次equal()进行安全校验。

2. 泛型

多种编程语言都支持泛型,泛型的实现有两种:Code specializationCode sharing

Code sharing的含义是共享字节码/目标代码,通过类型擦除,擦除后使用的是同一份字节码/目标代码。

Java在类型擦除时按照两个规则:

  1. 将所有的泛型类型用其最左边界(最顶级父类型)类型替换。
  2. 移除所有类型参数

3. 自动装箱与拆箱

自动装箱是Java将int、byte、short、long、char、double、float、boolean基础类型,自动转换为Integer、Byte、Short、Long、Character、Double、Float、Boolean包装类。
自动拆箱则反之。

自动装箱例子:

1
2
3
public static void main(String[] args) {
Long l = 1L;
}

反编译后:

1
2
3
public static void main(String[] args) {
Long l = Long.valueOf(1L);
}

自动拆箱例子:

1
2
3
4
public static void main(String[] args) {
Long l = 1L;
long l1 = l;
}

反编译后:

1
2
3
4
public static void main(String[] args) {
Long l = Long.valueOf(1L);
long l1 = l.longValue();
}

可以通过反编译后的代码看出,实际上自动装箱是使用valueOf()方法实现,自动拆箱使用xxxValue()方法实现。

4. 方法变长参数

可变长参数的实现:用数组实现,将多个参数封装成数组

5. 枚举

枚举类是Java语法糖之一,java枚举类隐式继承java.lang.Enum,所以枚举类不能继承其他类(Java单继承),但可以实现接口。
枚举类会继承values()、valuesOf()方法,枚举类中的枚举实例实际上是其本身的类实例并声明了public static final,所以对于枚举实例,可以声明变量外,还可以重写方法。
在Color中,GREEN实例重写了sayName方法,调用重写了方法的实例和无重写,会有不同的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//枚举类
public enum Color {
GREEN(301, "绿色") {
@Override
public void sayName() {
System.out.println("绿色!!!");
}
},
YELLOW(302, "黄色") {
@Override
public void sayName() {
System.out.println("黄色");
}
},
RED(303, "红色");
private Integer code;
private String name;

Color(Integer code, String name) {
this.code = code;
this.name = name;
}

public void sayName() {
System.out.println("Colorful");
}

}
1
2
3
4
5
6
7
//测试类
public static void main(String[] args) {
System.out.print("Color.RED.sayName():");
Color.RED.sayName();
System.out.print("Color.GREEN.sayName():");
Color.GREEN.sayName();
}
1
2
3
//输出
Color.RED.sayName():Colorful
Color.GREEN.sayName():绿色!!!

6. 内部类

7. 条件编译

8. 断言

9. 数值字面量

10. for-each

11. try-with-resource

12. Lambda表达式

Hollis原创|不了解这12个语法糖,别说你会Java

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔