关于语法糖
语法糖
解释:语法糖是指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虚拟机可见,并且与子类重写的父类方法没有命名冲突。
内部类
举例分析:匿名内部类
编译阶段会将匿名内部类生成一个额外的类,类名为外部类类名+$+数字
在外部类中创建匿名内部类的实例对象。