1、接口
定义:
public interface Comparable{
int compareTo(Object other);
}
若要使用Arrays类中的sort方法,对象所属的类必须实现Comparable接口。
实现:
class Employee implements Comparable{
public int compareTo(Object otherObject){
Employee other=(Employee) otherObject;
return Double.compare(salary,other.salary);
}
}
特性:
a.接口不能使用new实例化
b.不能构造接口的对象,却能声明接口的变量 Comparable x;
c.接口变量必须引用实现了接口的类对象 x=new Employee(...);
d.instanceof可以检查一个对象是否实现了某个特定的接口
e.接口可以继承,不能包含成员变量,可以包含常量,接口中的方法
都自动的设置为public,域自动设置为public static final
f.可以实现多个接口,但不能继承多个类
Java SE8中接口新增特性:静态方法和默认方法
静态方法:可以定义一个或者更多个静态方法。类似于类中的静态方法,接口定义的静态方法
可以独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需
要接口的实例,也就是说和调用类的静态方法的方式类似。语法如:接口名字.静态方法名
注:实现接口的类或者子接口不会继承接口中的静态方法。static不能和default同时使用。
默认方法:可以为接口方法提供一个默认实现。
public interface Comparable<T>{
default int compareTo(T other){return 0;}
}
默认方法主要优势是提供了一种扩展接口的方法,而不破坏现有代码。
默认方法另一个优势是该方法是可选的,子类可以根据不同的需求而且经override或者采用默认实现。
解决默认方法冲突:超类优先;覆盖默认方法
2、lambda表达式
lambda是一个匿名函数,可以把lambda表达式理解为是一段可以传递的代码.
语法:(parameters) -> expression或(parameters) ->{ statements; }
特性:不需要声明参数类型,编译器可以统一识别参数值,
一个参数无需定义圆括号,但多个参数需要定义圆括号,
主体包含一个语句,就不需要使用大括号,
如果主体只有一个表达式返回值则编译器会自动返回值。
lambda表达式的目标类型是函数式接口,可以用lambda表达式为函数式接口赋值:
Runnable r1=()->System.out.println("Hello!");
然后再赋值给一个Object: Object obj=r1;
用处:lambda表达式主要用于替换以前广泛使用的内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable,与集合类的批处理操作等
Thread t=new Thread( ()->System.out.println("hello!"));
list.forEach(o -> {System.out.println(o);}); //forEach函数实现内部迭代,循环打印list中的元素
方法引用:
Comparator<Integer> c21= (x, y) -> Integer.compare(x, y);等价于 Comparator<Integer> c1 = Integer::compare; (静态方法引用)
persons.forEach(e -> System.out.println(e));等价于 persons.forEach(System.out::println); (实例方法引用)
strList.stream().map(s -> new Integer(s));等价于 strList.stream().map(Integer::new); (构造器引用)