Java语法糖

简介:

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。——百度百科

目录

1.for-each

2.枚举

3.不定项参数

4.静态导入

5.自动装箱与拆箱

6.多异常并列

7.数值类型赋值优化

8.接口方法

1.默认方法

2.静态方法

3.私有方法(Java9接口的,带实现)

接口VS抽象类

9.try-with-resource

10.ResourceBundle文件加载

11.var类型

12.switch


1.for-each

语法更简单,避免越界错误

for可以删除元素,for-each不可以删除/替换元素

for-each遍历时,不知道当前元素具体位置索引

for-each只能正向遍历,不能反向,也不能同时遍历2个集合

2.枚举

变量取值只在一个有限的集合内

enum关键字声明枚举类,且都是Enum的子类(不需写extends)

enum内部有多少个值,就有多少个实例对象

不能直接new枚举类对象

也可以添加属性/构造函数/方法

构造函数只能是private,default进行内部调用

3.不定项参数

普通函数的形参列表是固定的

不定项参数(可变参数)类型后面加...

本质是一个数组

一个方法只能有一个不定项参数,且必须位于参数列表的最后

重载的优先级规则

1.固定参数的方法,比可变参数优先级更高

2.调用语句,同时与两个带可变参数的方法匹配会报错

4.静态导入

import static 导入一个类的静态方法和静态变量(相当于简写)

静态方法名有明确特征,如有重名,需要补充类名

5.自动装箱与拆箱

简化基本类型和对象转换的写法

装箱:基本类型的值被封装为一个包装类对象

拆箱:一个包装类对象被拆开并获取相应的值

这是编译器的工作,在class中已经添加,虚拟机没有自动装箱和拆箱的语句

==:基本类型是内容相同,对象时指针是否相同(内存同一个区域)

基本类型没有空值,对象有null

当一个基础数据类型与封装类进行==、+、-、*、/运算时,会将封装类进行拆箱,然后再运算

6.多异常并列

把多个异常并列在一个catch中,简写,用|分隔

多个异常之间不能有继承关系,如果有会报错

7.数值类型赋值优化

整数类型用二进制赋值,避免进行运算

在数值字面量中使用下划线_

增加可读性和纠错功能

下划线只能出现在数字中间,前后必须有数字

允许在二/八/十/十六进制的数字中使用

8.接口方法

Java8 推出接口的默认方法/静态方法(带实现),为Lambda表达式提供支持

1.默认方法

规则:

1:默认方法不能重写Object中的方法

2:实现类可以继承/重写父接口的默认方法

3:接口可以继承/重写父接口的默认方法

4:当父类和父接口都有(同名同参数)默认方法,子类继承父类的默认方法,方便兼容以前版本

5:子类实现2个接口(均有同名同参数的默认方法),那编译错误,必须在子类中重写这个default方法(要用到super)

2.静态方法

只属于本接口,不属于子类/子接口

子类(子接口)没有继承该静态方法,只能通过所在的接口名来调用

3.私有方法(Java9接口的,带实现)

解决了多个默认方法/静态方法的内容重复问题

只属于本接口,只在本接口内使用,不属于子类/子接口

子类(子接口)没有继承该私有方法,也无法调用

静态私有方法可以被静态/默认方法调用,非静态私有方法被默认方法调用

接口VS抽象类

相同点

都是抽象的,都不能被实例化(new),都可以有实现方法,都不需要继承者实现所有方法

不同点

1.抽象类只能继承一个,接口可以实现多个

2.接口的变量默认是public static final,且必须有初值,子类不能修改;而抽象类的变量默认是default,子类可继承修改

3.接口没有构造函数,而抽象类有

4.接口没有main函数,抽象类可以有

5.接口有public/default/private的方法,抽象类有public/private/protected/default的方法

9.try-with-resource

程序如果打开外表资源,在使用后需要正确关闭

考虑异常因素,Java提供try-catch-finally来保证

JDK7提供try-with-resource,比try-catch-finally更简洁

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

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

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

JDK9不再要求定义临时变量,可以直接使用

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

原理:资源对象必须实现AutoCloseable接口,即实现close方法

10.ResourceBundle文件加载

Java8及以前,默认以ISO-8859-1方式加载Properties文件

需要利用native2ascii工具(JDK自带)对文件进行转义

JDK9及以后,默认以UTF-8方式加载

若解析文件不是有效的UTF-8,则以ISO-8859-1方式加载

11.var类型

Java10推出:局部变量推断

避免了信息冗余,对齐了变量名,更容易阅读

本质上还是强类型语言,编译器负责推断类型,并写入字节码文件

推断后不能更改

限制:

可以用在局部变量上,非类成员变量

可以用在for/for-each循环

声明时必须初始化

不能用在方法(形式)参数和返回类型

大面积滥用会使代码整体阅读变差

var只在编译时起作用,没有在字节码中引入新内容

12.switch

不支持long/float/double,剩下都可以

JDK12支持多分支合并,采用-> 直接连接判定条件和动作

JDK12支持直接在表达式赋值


文章持续学习与更新,欢迎大家指正!

你可能感兴趣的:(Java,java)