关于语法糖

语法糖

解释:语法糖是指java编译器把*.java源码编译成*.class字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,

默认构造器

java类中不显示的创建构造器时,在编译成字节码后,编译器会自动帮助我们加上一个无参的构造器,并在此构造器中调用父类的无参构造方法。

自动拆装箱

从jdk5开始加入的拆装箱语法糖。

编译器在编译阶段执行

基本类型--->包装类型:装箱。

Integer a=2;//我们书写的代码
Integer a=Integer.valueOf(2);//编译器自动转换的代码

包装类型--->基本类型:拆箱

int b=a;//我们书写的代码
int b=a.intValue;//编译器自动转换的代码

泛型

解释:泛型,jdk5后加入的特性,但java在编译代码后会执行泛型擦除的动作,即泛型信息在编译为字节码之后就丢失了,实际的类型都当作了Object类型来处理。故在取值时,编译器真正生成的字节码中,还需要额外做一个类型转换的操作。

泛型擦除擦除的是字节码上的泛型信息,LocalVariableTypeTable(局部变量类型表)上仍保留了方法参数泛型的信息,但不能通过反射的手段拿到

只有在方法参数或返回值上带有的泛型信息,可以通过反射获取到。

在从集合中取值时,实际上操作的是Object对象,之后强制转型为泛型中定义的对象类型。并将结果返回。

可变参数

可变参数:jdk5加入的新特性

在编译期间java编译器会将可变参数变为数组

如果声明的可变参数并未给其赋值,会将其改编为一个空数组,而不是null;

forEach

forEach循环的写法,能够配合数组,及实现了Iterable接口的集合类一起使用。

1.遍历数组;

int[] arr={1,2,3,4,5};
//我们书写的代码
for(int e:arr){
	System.out.println(e);
}
//编译器自动转换的代码
for(int i=0;i<arr.length;++i){
    int e=arr[i];
    System.out.println(e);
}

2.遍历集合

List<Integer> list=new ArrayList();
//我们书写的代码
for(int e:list){
	System.out.println(e);
}
//编译器自动转换的代码;实际编译器转化为对迭代器的调用
Iterator iter=list.iterator();
while(iter.hasNext()){
    Integer e=(Integer)iter.next();
    System.out.println(e);
}

数组赋初值的简易写法

int[] arr={1,2,3,4,5};//我们书写的代码
int[] arr=new int[]{1,2,3,4,5};//编译器自动转换的代码

Switch

switch配合String和枚举使用,变量不能为空

Switch-String

在编译期间将一个Switch拆成了两个switch

第一个Switch中:先通过分支比较目标值的hashcode值与分支判断的hashcode值是否相等,内部再使用equals方法判断equals是否相等,都相等时,为其定义一个byte变量,并赋独一的标志值。

再进入下一个Switch中操作:比较byte值并输出响应内容

//我们书写的代码
public static void choose(String str){
        switch(str){
            case "f":
                System.out.println("food");
                break;
            case "d":
                System.out.println("drink");
                break;
        }
    }
//编译器自动转换的代码;
 public static void choose(String str){
        byte x=-1;
        switch(str.hashCode()){
            case 34324234://f的hashCode()
                if(str.equals("f")){
                    x=0;
                }
                break;
            case 3432424://d的hashCode()
                if(str.equals("d")){
                    x=1;
                }
                break;
        }
        switch(x){
            case 0://f的hashCode()
                System.out.println("food");
                break;
            case 1://d的hashCode()
                System.out.println("drink");
                break;
        }
    }

Switch-枚举

枚举类

try-with-resources

对需要关闭的资源处理的特殊语法

使用此语法的对象所属类必须实现AutoCloseAble接口

语法:

try(资源变量=创建资源对象){

}catch()	{

}

编译成字节码后:内部会自动增添一个try-catch-finally语句块进行资源的释放异常的捕捉,并且若释放资源时出现异常也是可以打印出此异常的。

方法重写时的桥接方法

方法重写的返回值有两种情况:

1.父子类的返回值完全一致

2.子类的返回值可以是父类返回值的子类

在编译期间,会生成一个返回值与父类完全一致的合成方法,再在此方法中调用返回值类型与父类不同的重写方法。

合成方法:对程序员不可见,jvm内部使用,此合成方法允许方法重名,

桥接方法:合成方法的一种,比较特殊,仅对jvm虚拟机可见,并且与子类重写的父类方法没有命名冲突。

内部类

举例分析:匿名内部类

​ 编译阶段会将匿名内部类生成一个额外的类,类名为外部类类名+$+数字

在外部类中创建匿名内部类的实例对象。

posted on 2021-07-03 20:21  凡人精灵  阅读(58)  评论(0编辑  收藏  举报

导航