JDK新特性
1. 自动装箱/出箱
自动装箱/出相是编译器在编译的时候自动完成的
JDK5.0以后 简单类型可以直接存储在集合中
2.静态引入:
通过静态引入可以在使用一个类型静态成员的时候,不用书写类名,直接使用静态成员即可
3.for..each循环
通过for..each循环 可以遍历 数组 、集合
4.可变长参数
可以使方法的参数个数可变
public static void print(String... s){ }
可变长参数其本质实际上就是数组,单比定义数组更加灵活
可以把main函数改写成可变长参数
一个方法中最多有一个可变长参数
可变长参数必须作为方法的最后一个参数
5.格式化的输入\输出
System.out.printf("your name is %s age is %d",name,age);
6.枚举类型
一个类所创建的对象的类型的个数是固定的
枚举本质上还是类
enum关键字
枚举类型可以定义属性,并提供相应的方法
枚举类型有构造方法 但只能是私有的
枚举不能够继承
枚举类型默认是final修饰符修饰,也是不能被别的类继承
枚举可以提供抽象方法
7.泛型
实现类型安全的集合
泛型集合在存储数据时支持多肽
泛型集合必须保证引用类型的泛型和对象类型的泛型一致
java编译器在JDK5 以后建议集合使用泛型, 如果不使用泛型,编译器会提出警告
8.标注
标注的概念(注解):给程序看的注释
普通的注释:给人看的,不是必须的
标注可以修饰类,方法,属性,包名,方法参数...
@标注名
JDK中提供的标注
@Override 重写
表明该方法一定是重写父类的方法
@Deprecated 过时
表明该方法已经过时,可能存在风险
@SupperessWarnings
标注的分类
1.标记标注
2.单值标注
3.多值/普通标注
元标注:修饰标注的标注
@Target
限定标注的使用目标
@Retention
指明标注信息的保存时间
完整的标注定义
标注属性:
@interface aa{int num(); }
在加标注的时候必须要在标注名后加参数
@aa(2)
标注属性的类型共有24种基本类型,String,Class,enums,annotations, 以及它们的数组
并发
JDK以后引入了并发包,摒弃了原有的Java线程框架
摒弃了Runnable接口
引用 public T call() throws Exception
摒弃synchronized
引用 lock() unlock() tryLock()
摒弃wait() notify() notifyAll()
引用 await() signal() signalAll()
java SE6:脚本支持
为开发者提供了在同一应用中使用不同语言的能力
为Java库扩展脚本语言
Sun的SDK中提供了JavaScript引擎
提供对编译器javac的访问,用于动态生成代码
java SE7:更好的整型字面值
二进制字面值
switch-case支持String类型
IO流无需在finally中关闭
泛型实例化类型自动推断 例:List<Integer> n=new ArrayList<>();
JDK8新特性
接口的默认方法
给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法
Lambda表达式
函数式接口
Lambda 表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解说说,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。