java语法糖

本文概述了编程中的语法糖概念,重点讨论了Java中的几个实例,如switch对String的支持、泛型和类型擦除、自动装箱拆箱等。讲解了这些看似便利的语法背后在编译期如何转化为基础结构,以及诸如枚举、内部类、条件编译等高级特性。
摘要由CSDN通过智能技术生成

指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
并且该语法糖只存在编译期。
解语法糖
java虚拟机并不支持所谓的语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构。这个过程就叫做解语法糖。

基本语法糖块
1.switch支持String与枚举
其实对于编译器来说switch中其实只能使用整型。
而对于String类型的支持,是通过equals和hashcode的方法来进行实现的。先比较哈希值,再通过equals方法进行比较。
编译前:
在这里插入图片描述
反编译后:
在这里插入图片描述
枚举
在这里插入图片描述
在这里插入图片描述

2.泛型和类型擦除
虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除。
例如:
java虚拟机根本不认识Map<String, String> map这样的语法,将其解语法糖之后就会变成Map map = new HashMap();

3.自动装箱与拆箱
java自动将原始类型值转换成对应的对象,该过程叫做装箱,反之叫做拆箱。
装箱的时候自动调用的是Integer的valueof方法,在拆箱的时候自动调用的是Integer的intvalue方法

public class Candy{
	public static void main(String[] args){
		Integer x = 1;
		int y = x;
	}
}
//反编译后的结果
public class Candy{
	public static void main(String[] args){
		Integer x = Integer.valueOf(1);
		int y = x.intValue();
	}
}

4.方法变长参数
允许一个方法把任意数量的值作为参数

public static void main(String[] args) {
    print("aaaaa", "bbbbb", "ccccc");
}

public static void print(String... strs) {
    for (int i = 0; i < strs.length; i++) {
        System.out.println(strs[i]);
    }
}

反编译之后

public static void main(String[] args) {
    print(new String[]{"aaaaa", "bbbbb", "ccccc"});
}
public static void print(String[] strs) {
    for (int i = 0; i < strs.length; i++)
        System.out.println(strs[i]);
}

将其反编译后的代码可以看到,可变参数在被使用的时候,java虚拟机首先会创建一个数组,数组的长度就是调用该方法时传递实参的个数,然后再把参数值全部放到这个数组当中,再把这个数组作为参数传递到被调用的方法中。
5.枚举
关键字enum可以将具有名和值的有限集合创建成为一个新的类型,这个集合可以被程序使用。
enum是一个关键字,并不是一个类
当我摩恩使用enum来定一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承enum类,所以枚举类型不能被继承。
在这里插入图片描述
在这里插入图片描述

6.内部类
在一个类里面定义一个其他的类,一旦编译成功就会生成两个完全不同的.class文件,分别是outer.class和outer$inner.class文件。
7.条件编译
在一般情况下,程序中的每一行代码都要参加编译。但是有的时候对于优化的考虑,只对代码内容中的一部分进行编译。典型的例子就是ifelse语句
如果if后为真则只编译if内的语句,反之则编译else中的语句
8.断言
其实断言的底层实现就是if语言,如果断言结果为true,则什么都不做,程序继续执行,如果断言结果为false,则程序抛出AssertError来打断程序的执行
9.数值字面量
不管是证书还是浮点数,都允许在数字之间插入任意多个下划线。不会影响数字字面的数值主要是为了方便阅读。在反编译的阶段,会将下划线删除。
10.增强for循环
实现的原理就是使用了普通的for循环和迭代器

public class Candy{
	public static void main(String[] args){
	int[] arr = {1,2,3,4,5};
	for(int e:arr){
		System.out.println(e);
		}
	}
}
//反编译后的结果
public class Candy{
	public static void main(String[] args){
		int[] arr = new int[]{1,2,3,4,5};
		for(int i=0;i<arr.length;i++){
			int e = arr[i];
			System.out.println(e);
		}
	}
}

public class Candy{
	public static void main(String[] args){
	List<Integer> list = Arrays.asList(1,2,3,4,5);
	for(int i:list){
		System.out.println(i);
	}
}
//反编译后的结果
public class Candy{
	public static void main(String[] args){
		List<Integer> list = Arrays.asList(1,2,3,4,5);
		Iterator iter = list.iterator();
		while(iter.hasNext()){
		Integer e=  (Integer)iter.next;
		System.out.println(e);
	}
	}
}

11.try-with-resource语句

public static void main(String args[]) {
    try (BufferedReader br = new BufferedReader(new FileReader("d:\\ hello.xml"))) {
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        // handle exception
    }
}

简化的关闭文件
12.Lambda表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值