1、接口
1.1 接口的特性
接口是用来描述类要实现的功能,接口可以声明而不实现方法,接口的特性主要有以下几点:
- 不能使用new实例化接口,但可以声明接口类型变量,接口变量必须引用实现了接口的类实例。
- 一个类只能扩展一个类,但可以实现多个接口,并且一个接口可以扩展多个接口。
- 接口中不能包含实例域和不建议包含静态方法,可以包含常量。
- 接口中的方法自动被标记为public,接口中的域自动被标记为public static final。
示例:声明compareTo方法的Compare接口
/*定义Compare接口*/
public interface Compare<T>{
int compareTo(T other);
}
/*实现Compare接口*/
public class Employee implements Compare<Employee>{
private double salary;
public int compareTo(Employee other){
return Double.compare(salary,other.salary);
}
}
1.2 接口的默认方法
给接口方法提供一个默认实现(用default标记该方法),这样可以避免因一个类没有实现接口的全部方法而引发编译错误。
public interface MouseListener{
default void mouseClicked(MouseEvent event){}
}
1.3 lambda 表达式
lambda表达式是一个可传递代码块,Java中的方法一般是封装在类中的,传递一个方法一般是传递一个类对象,再通过类对象调用方法,lambda表达式的出现使得代码块(方法)不需要通过对象传递,lambda表达式的语法为 :(形参列表)-> { 表达式 }
/**
* 比较两个字符串的长度
*/
(String first, String second) ->
{
if(first.length() < second.length()) return -1;
else if(first.length() > second.length)) return 1;
else return 0;
}
lambda表达式可作为函数式接口,用于替代只有一个抽象方法的接口对象,增强代码可读性。
Arrays.sort(strings, (first, second)->{first.length()-second.length()}
方法引用:用现有的方法代替lambda代码块,格式:类名::方法名, String::compareToIgnoreCase等价于(x,y)->x.compareToIgnoreCase(y)
/*忽略大小写对字符串数组排序*/
Arrays.sort(strings, String::compareToIgnoreCase);
构造器引用:类名::new
变量作用域:lambda表达式可以访问外部变量,但这个外部变量必须是final的,即运行时不会被改变的,否则可能引发线程不安全。