1.枚举(实际上就是多例)
java中枚举使用enum来定义,enum并不是一个新的结构,使用enum定义的枚举
实际上默认继承Enum枚举类。因此enum定义的枚举结构实际上就是一个多例类。
1.1Enum枚举类常用的三个方法:
- ordinal():返回枚举对象下标,默认第一个对象编号为0;
- name():返回枚举对象名称,默认与对象名称保持一致
- values():返回所有枚举对象
范例:对于Enum枚举类方法的使用
enum Color2{
RED,YELLOW,BLUE;
}
public class UseEnumTest {
public static void main(String[] args) {
System.out.println(Color2.BLUE);
System.out.println(Color2.BLUE.ordinal()+"="+Color2.BLUE.name());
for(Color2 colors2:Color2.values()){
System.out.println(colors2);
}
}
}
1.2枚举中支持定义其他结构,如构造方法、普通属性、普通方法
1.3当枚举类中还包含其他结构,枚举对象的定义必须放在首行
1.4枚举可以实现接口,这样枚举中的每一个对象都变成了接口对象
范例:多例模式
package javaSE.bit.EnumClassTest;
/**
* 多例模式
* @author mayanni
* @date 2019-04-28 17:50
*/
class Color{
private String name;
private static Color RED=new Color("red");
private static Color BLUE=new Color("blue");
private static Color YELLOW=new Color("yellow");
private Color(String name){this.name=name;}
public static Color getInstance(String colorName){
switch (colorName){
case "RED":
return RED;
case "BLUE":
return BLUE;
case "YELLOW":
return YELLOW;
default:
return null;
}
}
public String toString(){
return this.name;
}
}
public class Test {
public static void main(String[] args) {
Color red=Color.getInstance("RED");
Color blue=Color.getInstance("BLUE");
System.out.println(red);
System.out.println(blue);
}
}
2.注解
JDK内置的三大注解
2.1 @Override准确覆写:
编译期间检查当前覆写方法是否满足要求(方法名称是否正确、权限是否合理)
2.2 @Deprecated过期声明:
在早期版本的代码(方法),表示该方法在当前版本中已经不推荐使用,但是使用了也不报错。
只是起一个警告提示作用
2.3 @SuppressWarnings 压制警告
压制警告信息,压制警告信息不再提示
- JDK1.8接口
早期版本(jdk1.8之前)的接口已经有很多子类实现了,此时发现接口中的方法需要改动甚至新增方法,无法修改接口(全局常量+抽象方法)
将接口做了扩充:支持default定义的普通方法与静态方法
I.使用default定义的普通方法,通过子类对象调用,所有子类均有此方法,此时的default不能省略
II.使用static定义的静态方法,通过接口名称直接调用。
4.Lambda表达式(函数式编程)
使用Lambda表达式要求接口中有且只有一个抽象方法。
JDK1.8新增注解 @FunctionalInterface只能用于接口声明,检测当前接口是否只有一个抽象方法
4.1方法体实现只有一行
( )-> 具体实现代码;
4.2方法体有多行实现
( )-> {
方法体实现代码
}
4.3方法若有返回值:
a.只有一行代码,return可以省略
b.方法体有多行代码,此时return不能省略
5.方法引用:
一般结合Lambda表达式共同使用;引用的是方法的具体实现
5.1引用某个类的静态方法
String类中的valueOf()方法
ISubject<Integer,String > is=String :: valueOf;//进行方法引用
String str=is.switchPara(1000000);//等同于 String.valueOf()方法
System.out.println(str);
5.2引用某个对象的普通方法
String中的toUpperCase()方法为对象方法
ISubject<String> is = "hello"::toUpperCase;
System.out.println(is.switchPara());
5.3引用某个类的普通方法
String类中的compareTo()方法,此方法为普通方法
ISubject<Intgeter,String> is = String :: compareTo;
System.out.println(is.switchPara("马","杨"));
5.4引用某个类的构造方法
class Person {
private String name ;
private int age ;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
@FunctionalInterface // 是一个函数式编程接口,只允许有一个方法
interface IUtil<R,PN,PA> {
public R createPerson(PN p1,PA p2) ;
}
public class TestDemo {
public static void main(String[] args) {
IUtil<Person,String,Integer> iu = Person :: new;
System.out.println(iu.createPerson("yuisama", 25)); // 相当于调用Person类的构造方法
}
}