1.枚举
语法:
enum Color {
RED,BLUE,GREEN;
}
使用enum关键字定义的枚举结构实际上是默认继承了Enum类的枚举类。
Enum类中存在两大属性:
- name:枚举对象名称
- ordinal:枚举对象数字下标
public final String name() : 取得枚举对象名称
public final int ordinal() : 取得枚举对象下标
取得所有枚举类对象:
枚举类.values()
枚举中定义其他结构:
- 枚举中若定义构造方法,构造方法必须用private封装(枚举类是多例类,枚举类外部无法产生对象);
- 枚举中若定义其他结构,枚举对象声明必须放在枚举类的首行。枚举中若定义其他结构,枚举对象声明必须放在枚举类的首行。
枚举实现接口:
枚举中的对象自动变为接口对象。
2.注解 @
@Override准确覆写:
当子类覆写父类方法时,此注解检查覆写的方法是否正确声明,只有满足覆写方法要求才会编译通过,否则编译出错。
@Deprecated过期声明:
建议用户不使用原有的类&方法时,可以在类或方法上@Deprecated表示在当前版本中不推荐使用。
@SuppressWarings 压制警告:
调用某些操作可能产生问题的时候会出现警告信息,但是警告信息并不是异常。
3.JDK1.5 新特性
3.1可变参数
要求设计一个方法,用于计算任意参数的整数的相加结果。
public [static] [final] 返回值 方法名称([参数类型 参数名称][参数类型 ... 参数名称]){}
(类型 . . . 参数名称)
注意:
一个方法有且只能有一个可变参数,并且放在方法的最后一个参数可变参数的本质还是数组。
foreach 循环用于数组与类集的简单输出.
静态导入:
如果类中方法全是static方法,则可以直接把这个类的方法导入进来,这样就好比像在主类中定义的 方法那样,可以被主方法直接调用。
3.2 泛型 - 守门员
定义:
在类定义的时候并不会设置类中的属性或方法中参数的具体类型,而是在类使用时再定义。
具体特性:https://blog.csdn.net/qq_40933663/article/details/87922802
4.JDK1.8新特性
4.1 接口定义增强
JDK1.8之后接口中允许出现以下两类方法:
- 使用default定义的普通方法,需要通过接口对象来调用;
- 使用static定义的静态方法,直接使用接口名调用。
4.2 Lambda表达式
要想使用函数式编程有一个前提:接口必须只有一个方法。如果存在两个以上的方法,无法使用函数式编程。
如果现在某个接口就是为了函数式编程而生的,在定义时只能存在一个方法,因此有一个新的注解@FunctionalInterface,此注解会检查该接口中是否只存在一个抽象方法,存在两个抽象方法以上编译报错。
语法:
方法体只有一行代码时:
(方法参数) -> 具体的方法体实现。
当方法有返回值时,单行代码的lambda表达式可以省略return语句:
@FunctionalInterface
interface IMessage {
void print();
}
@FunctionalInterface
interface IAdd {
int add(int x,int y);
}
public class Test{
public static void main(String[] args) {
IMessage msg = () -> System.out.println("hello world");
msg.print();
IAdd add = (p1,p2) -> p1+p2;
System.out.println(add.add(10,20));
}
}
当方法体有多行代码时:
(方法参数) -> {
....
....
...
[return 语句];
};
IAdd add = (p1,p2) -> {
int result = p1+p2;
result+=20;
return result;
};
System.out.println(add.add(10,20));
5.方法引用-与Lambda表达式搭配使用
方法引用只是给现有方法起了个别名。
方法引用有四种形式:
5.1 引用类中静态方法
类名称 :: 静态方法名称
interface IUtil<P,R> {
R switchPara(P p);
}
public class Test{
public static void main(String[] args) {
IUtil<Integer,String> util =
String :: valueOf;
// 相当于调用String.valueOf(10);
String str = util.switchPara(10);
System.out.println(str.startsWith("1"));
}
}
5.2 引用某个对象的方法
实例化对象 :: 普通方法
interface IUtil<R> {
/**
* public String toUpperCase()
* @return
*/
R switchPara();
}
public class Test{
public static void main(String[] args) {
IUtil<String> util =
"hello" :: toUpperCase;
// 相当于调用了"hello".toUpperCase();
System.out.println(util.switchPara());
}
}
5.3 调用类中普通方法
类名称 :: 普通方法名
interface IUtil<R,P> {
/**
* @param p1
* @param p2
* @return R
*/
R compare(P p1,P p2);
}
public class Test{
public static void main(String[] args) {
IUtil<Integer,String> util =
String::compareTo;
System.out.println(util.compare("刘","杨"));
}
}
5.4 引用类中构造方法
类名称 :: new
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
interface IUtil<R,PN,PR> {
R createPer(PN p1,PR p2);
}
public class Test{
public static void main(String[] args) {
IUtil<Person,String,Integer> util =
Person::new;
System.out.println(util.createPer("小明",45));
}
}