Java核心技术(高阶) 之一 语法糖

0.简介

指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

1.for vs for-each

   1. for-each 从jdk5.0开始引入
   2. for-each语法更加简洁,能避免越界错误
   3. for可以删除元素,但for-each不能删除/替换元素
   4. for-each只能正向遍历,不能反向遍历
   5. for-each不能同时遍历两个集合
   6. for和for-each性能接近(for稍快)
doule[] nums = new double[5];
for(int i=0;i<nums.length();i++){
    num[i] = Math.random();
}
for(double item:num){
    System.out.println(item);
}

2.枚举类型

   1. enum内部有多少个值,就有多少个实例对象
   2. 不能直接new枚举类对象
   3. enum内部值不能重复(集合)
//定义
public enum Size{
    SMALL,MEDIUM,LARGE,EXTRA_LARGE;
}

//使用
Size s1 = Size.SMALL;
Size s2 = Size.MEDIUM;
Size s3 = Size.SMALL;
Size s4 = Size.EXTRA_LARGE;

//s1==s2  true,因为enum内部有多少个值,就有多少个实例对象
4.除了枚举的内容,还可以添加属性/构造函数/方法
    构造函数能能是package-private(default)或private!!!
5.主要方法:
  ordinal():返回枚举值所在的索引位置
  compareTo():比较两个枚举值的索引位置大小(发挥值是两者之差)
  toString():返回枚举值的字符串表示
  valueOf():将自负床初始化为枚举对象
  values():返回所有的枚举值
enum Fruit
{
	APPLE(10),ORANGE(8);
	private int price;

	Fruit(int price){
		this.price = price;
	}

	int getPrice(){
		return this.price;
	}
}
public static void main(String[] args){
        Day d1 = Day.MONDAY;
        Day d2 = Enum.valueOf(Day.class, "MONDAY");
        System.out.println(d1==d2);
    
        Day d3 = Enum.valueOf(Day.class, "SUNDAY");
        System.out.println(d1.compareTo(d3));
    
        for(Day item : Day.values()){
            System.out.println(item.ordinal()+","+item.toString()+" ");
        }
    }
    
enum Day{
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,RFIDAY,SATURDAY,SUNDAY;
}

3.不定项参数

1.类型后面加3个点,如int.../double.../String...    [可变参数,本质上是一个数组]
public static void print(String... args){
    for(String item:args){
    System.out.println(item);
    }
}

//调用
print();
print("aaa","bbb","ccc");
注意事项:
1.一个方法只能由一个不定项参数,且必须位于参数列表的最后
2.重载(函数名相同,参数不同)的优先级规则:固定参数的方法,比可变参数优先级更高;调用语句,同时与两个带可变参数的方法匹配,则报错

4.静态导入

import static java.lang.Math.pow;
import static java.lang.System.*;//所有静态方法和变量
注意:
1.少用*,不滥用;
2. 静态方法名具有明确特征,如有重名,需要补充类名

5.自动拆箱和装箱

1.jdk5.0引入,简化基本类型和对象转换的写法
2. boolean/byte/char/int/short/long/float/double对应
   Boolean/Byte/Character/Integer/Short/Long/Float/Double
3. 当一个基础数据类型与装箱类进行==,+,-,*,/运算时,会将封装类进行拆箱,对基础数据类型进行运算。
Integer obj1 = 5;//自动装箱
Integer obj2 = Integer.valueOf(5);//无自动装箱

int a1 = obj1;//自动拆箱
int a2 = obj1.intValue();//无自动拆箱
public static void main(String[] args){
    Integer a1 = 1000;
    int a2 = 1000;
    Integer a3 = 2000;
    Long a4 = 2000L;
    long a5 = 2000L;
    
    //拆箱再进行数值比较
    System.out.println(a1==a2);//true
    System.out.println(a3==(a1+a2));//true
    System.out.println(a4==(a1+a2));//true
    System.out.println(a5==(a1+a2));//true
    //equals要求同类,且内容相同a2
    System.out.println(a3.equals(a1+a2));//true
    System.out.println(a4.equals(a1+a2));//false
    System.out.println(a4.equals((long)(a1+a2)));//true
}

6.多异常并列

jdk7.0引入
try{
    test()
}
catch(IOException | SQLException ex){
    //|为管道符号
    //多个异常之间不能有(直接/间接)继承关系,如果有,则报错
}

7.数据类型赋值优化

jdl7引入
1.整数类型用二进制数赋值,适用于byte/short/int/long
2.在数值字面量中使用下划线:,适用 short/int/long/float/double
  注意:下划线只能出现在数字中间!!!!
          允许在二/八/十/十六进制的数字中使用
          可以多喝下划线(如int a = 123__45;)
byte a1 = (byte) 0b0010001;
short a2 = (short) 0b0010101010;
int a4 = 0B0101;

8.接口方法

java8退出接口的默认方法/静态方法(都带实现的),为lambda表达式提供支持
public interface NewAnimal{
    public default void move(){
        System.out.println("I can move~");
    }
}

默认方法

注意: 
1.default关键字:接口的默认方法的标志(不是权限)
2.默认方法不能重写Object中的方法(如toString()等);
3.实现类可以继承/重写父接口的默认方法;
4.接口可以继承/重写父接口的默认方法;
5.当父类和父接口都有(同名同参数)默认方法,子类继承父类的默认方法,这样可以兼容JDK7及以前的代码;
6.子类实现了2个接口(均有同名同参数的默认方法),那么编译失败,必须在子类中国重写这个default方法。
//如何调用父接口的默认方法
fatherInterFace.super.fun();

静态方法

//接口的静态方法,不能被继承!!!!(不属于子类/子接口)
public interface StaticAnimal {
    public static void move()
    {
        //do something
    }
}
public interface StaticAnimal2 extends StaticAnimal {
    //无move方法
}

public static staticSwan implements StaticAnimal{
    public static void main(String[] args){
        StaticAnimal.move();
        StaticAnimal2.move();//报错
        new StaticSwan.move();//报错
    }
}

私有方法

java9接口的私有方法,解决多个默认/静态方法的内同重复问题
1.私有方法属于本接口,不属于子类/子接口
2.子类/子接口无法调用!!!只能在本接口使用
3.非静态私有方法可以被静态/默认方法调用,静态私有方法被默认方法调用;(非静态可调用静态,静态方法只能调用静态私有方法)

JAVA12 接口与抽象类相同点与不同点
在这里插入图片描述在这里插入图片描述

9.try-with-resource

try(FileInputStream fis = ...){
    ....
}catch(Exception e){
    ....
}
//资源会默认关闭(实现AutoCloseable接口(即实现close方法)

jdk7 vs jdk9
jdk7中资源要求定义在try中,若在外面定义,则需要一个本地变量

FileInputStream fis = ...;
try(FileInputStream fis2=fis){
   ...
}catch(Exception e){
   ...
}

jsk9不在要求定义临时变量,可以直接使用外部资源变量

FileInputStream fis = ...;
try(fis){
   ...
}catch(Exception e){
   ...
}

10.ResourceBundle文件加载

JDK9及以后,ResourceBundle默认以UTF-8方式加载Properties文件(删除native2ascii工具)

11.var类

java10推出var:局部变量推断
避免信息冗余,对齐了变量名,更容易阅读。
但本质上还是强类型语言,编译器负责推断类型,并写入字节码文件,因此推断后不能更改!!!
注意事项:
1.可以用在局部变量,非类成员变量
2.不能用var类型同时推断多个变量(var a=1,b=2,c=3;)
3.不能var a=null; var num = {0,1,2}(无法推断)
4.可以和三元操作符配合
5.var对继承有效,子类型var可以赋值给父类型的var
6.var类型不能放在形参或返回值

12.switch

支持的类型:byte/Byte,short/Short,int/Integer,char/Character
String(7.0),Enum(5.0),不支持long/float/double;
jdk12:
1.多分支合并,采用->直接链接判定条件和动作;(不需要break)
2.switch直接在表达式赋值
int num = 1;
int days = switch(num){
    case 1,3,5,7,8,10,12->31;
    case 4,6,9,11->30;
    default -> {
        int result = 28l
        break result;//代码块中break返回结果
    }
};

//旧的版本
switch(num){
    case 1:case 3:case 5:case 7:vase 8:case 10:case 12:
    result = 31;break;
    case 4:case 6:case 9:case 11:
    result = 30;break;
    default:reault=20;break;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值