视频网站建设成本,网站备案的幕布,兰州发布紧急通知,哪个网站免费h5模板多文章目录 概览泛型增强for循环自动装箱与拆箱字符串拼接枚举类型可变参数内部类try-with-resourcesLambda表达式 概览
语法糖是指编程语言中的一种语法结构#xff0c;它们并不提供新的功能#xff0c;而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或… 文章目录 概览泛型增强for循环自动装箱与拆箱字符串拼接枚举类型可变参数内部类try-with-resourcesLambda表达式 概览
语法糖是指编程语言中的一种语法结构它们并不提供新的功能而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或操作变得更加简洁和直观但在底层实现上并没有引入新的语言特性或改变语言的表达能力。
尽管语法糖使得代码更加简洁和易读但实际执行时底层代码仍然需要遵循编程语言的基本语法和规则。在编译阶段编译器将使用语法糖编写的高级语法转换为更基础、更原始的语法结构便于生成相应的目标代码如字节码或机器码这就是解语法糖的过程。这个过程确保了最终执行的代码在语义上与原始的语法糖一致同时能够在目标环境中正确运行。Java编译器的desugar()方法负责这个过程这个过程确保了Java语言的高级特性可以在不增加JVM复杂性的情况下实现从而提高了开发效率和代码可读性。
举例来说假设有如下的Java语法糖
ListString list new ArrayList();
list.add(Hello);
String s list.get(0);在这段代码中泛型String是语法糖。编译器在编译这段代码时会将其转换为如下的基础语法
List list new ArrayList();
list.add(Hello);
String s (String) list.get(0);泛型
泛型允许类、接口和方法在声明时使用参数化类型提供了编译时类型安全检查机制避免了强制类型转换的麻烦。但Java中的泛型只在程序源代码中有效在编译后的字节码中会自动用强制类型转换进行替代。也就是说Java语言中的泛型机制其实就是一颗语法糖
// 泛型示例
ListString names new ArrayList();
names.add(Alice);
String first names.get(0);// 解语法糖
List names new ArrayList();
names.add(Alice);
String first (String) names.get(0);增强for循环
增强for循环用于遍历数组或集合即要么是一个数组要么实现了Iterable接口与普通for循环相比功能更强并且代码更简洁。
public static void main(String[] args) {String[] params new String[]{hello,world};//增强for循环对象为数组for(String str : params){System.out.println(str);}ListString lists Arrays.asList(hello,world);//增强for循环对象实现Iterable接口for(String str : lists){System.out.println(str);}
}// 解语法糖
public static void main(String[] args) {String[] params new String[]{hello, world};String[] lists params;int var3 params.length;//数组形式的增强for退化为普通forfor(int str 0; str var3; str) {String str1 lists[str];System.out.println(str1);}List var6 Arrays.asList(new String[]{hello, world});Iterator var7 var6.iterator();//实现Iterable接口的增强for使用iterator接口进行遍历while(var7.hasNext()) {String var8 (String)var7.next();System.out.println(var8);}}自动装箱与拆箱
自动装箱和自动拆箱是Java中的语法糖用于简化基本数据类型和其对应包装类型之间的转换操作。当将基本数据类型赋值给对应的包装类型时编译器会调用包装类型的valueOf()方法来创建一个包装对象并将基本数据类型的值传递给这个方法。当需要使用包装类型对象中的值进行基本数据类型的操作时编译器会自动调用包装类型对象的xxxValue()方法将包装对象转换为对应的基本数据类型值。
Integer boxedNum 10; // 自动装箱
int num boxedNum; // 自动拆箱// 解语法糖
Integer boxedNum Integer.valueOf(10);
int num boxedNum.intValue();字符串拼接
拼接字符串最简单的方式就是直接使用符号“来拼接其实“”是Java提供的一个语法糖。字符串拼接使用”操作符在编译时会被转换为StringBuilder操作。
String message Hello, name !;// 解语法糖
StringBuilder sb new StringBuilder();
sb.append(Hello, );
sb.append(name);
sb.append(!);
String message sb.toString();枚举类型
枚举类型就是一些具有相同特性的类常量在Java中类的定义使用class枚举类的定义使用enum。但在Java的字节码结构中其实并没有枚举类型枚举类型只是一个语法糖在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum并被final关键字修饰。
public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}// 解语法糖
public final class Day extends EnumDay {public static final Day MONDAY new Day(MONDAY, 0);public static final Day TUESDAY new Day(TUESDAY, 1);public static final Day WEDNESDAY new Day(WEDNESDAY, 2);public static final Day THURSDAY new Day(THURSDAY, 3);public static final Day FRIDAY new Day(FRIDAY, 4);public static final Day SATURDAY new Day(SATURDAY, 5);public static final Day SUNDAY new Day(SUNDAY, 6);private final String name;private final int ordinal;private Day(String name, int ordinal) {this.name name;this.ordinal ordinal;}public String name() {return name;}public int ordinal() {return ordinal;}public static Day[] values() {return (Day[]) $VALUES.clone();}public static Day valueOf(String name) {return (Day) Enum.valueOf(Day.class, name);}private static final Day[] $VALUES {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
}可变参数
可变参数就是允许方法接受可变数量的参数。使用变长参数有两个条件一是变长的那一部分参数具有相同的类型二是变长参数必须位于方法参数列表的最后面。变长参数同样是Java中的语法糖其内部实现是Java数组。
public void printNumbers(int... numbers) {}// 解语法糖
public void printNumbers(int[] numbers) {}内部类
内部类就是定义在一个类内部的类之所以引入内部类是因为有些时候一个类只在另一个类中引用我们不想让其在另外一个地方被使用。内部类可以在一个类内部定义但在编译时会被转换为独立的类文件并不是真正套在一个类的内部而是分成两个类编译。
class Outer {class Inner {void display() {System.out.println(Inner class method);}}
}// 解语法糖
class Outer {class Inner {final Outer outer;Inner(Outer outer) {this.outer outer;}void display() {System.out.println(Inner class method);}}
}try-with-resources
try-with-resources语句简化了资源管理使得资源在使用后自动关闭这个语法糖就能让代码及其简洁。原理是编译器把它转换成了try-catch-finally。
try (BufferedReader reader new BufferedReader(new FileReader(file.txt))) {String line reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
}// 解语法糖
BufferedReader reader null;
try {reader new BufferedReader(new FileReader(file.txt));String line reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
} finally {if (reader ! null) {try {reader.close();} catch (IOException ex) {ex.printStackTrace();}}
}Lambda表达式
Lambda表达式是Java中的一种语法糖它提供了一种简洁地表示匿名函数的方法在语法上的简洁性大大提升了代码的可读性和编写效率。在编译后Lambda表达式会被转换为相应的匿名内部类形式。
Runnable r () - System.out.println(Hello, World!);// 解语法糖
Runnable r new Runnable() {Overridepublic void run() {System.out.println(Hello, World!);}
};