当我们写出一个interface接口后,需要有类去实现implements他,并且实现接口中的函数,而实现接口的方式有五种,下面分别介绍一下这五种方式。
最常见的就是在一个类的外部implements接口
interface Student
{
void study();
}
class Pupil implements Student
{
@Override
public void study() {
System.out.println("我是一名小学生");
}
}
public class implementClass {
public static void main(String[] args) {
Pupil pupil = new Pupil();
pupil.study();
}
}
静态内部类是给实现接口的类加上static修饰词,使得这个类能够存在另一个类的里面
interface Student
{
void study();
}
public class implementClass {
//静态内部类
static class Junior implements Student
{
@Override
public void study() {
System.out.println("我是一名初中生");
}
}
public static void main(String[] args) {
Junior junior = new Junior();
junior.study();
}
}
局部内部类是可以在某个函数中实现接口的类,如果只是想在一个代码块中使用这个类,之后不再使用的话,可以使用这种方法。在下面的例子中就是实现了一个Senior类在main函数中。
interface Student
{
void study();
}
public class implementClass {
public static void main(String[] args) {
//局部内部类
class Senior implements Student
{
@Override
public void study() {
System.out.println("我是一名高中生");
}
}
Junior junior = new Junior();
junior.study();
}
}
匿名内部类与局部内部类一样,可以在某个函数体中使用,不同的是,匿名内部类是不用给新类起名字的(这就是叫作“匿名”的原因),匿名内部类是直接实现接口的函数即可。
interface Student
{
void study();
}
public class implementClass {
public static void main(String[] args) {
//匿名内部类
Student underGraduate = new Student(){
@Override
public void study() {
System.out.println("我是一名大学生");
}
};
underGraduate.study();
}
}
函数式接口是指只含有一个函数的接口,例如下面这个接口就是一个函数式接口。
interface MathOperation {
int operation(int a, int b);
}
lamda表达式是实现函数式接口的一种简单方式,他的形式类似于下面的样子
(parameters) -> expression 或 (parameters) ->{ statements; }
"->"这个符号的后面就是实现接口中函数的代码,具体可以看下面这个例子
interface Student
{
void study();
}
public class implementClass {
public static void main(String[] args) {
//lamda表达式
Student student = ()->{
System.out.println("我是一名研究生");
};
student.study();
}
lamda表达式是形式上简化了实现接口的方式,但实际上和一般实现接口一样,也可以传参和返回值,例如下面的例子:
interface Clock
{
String printTime(int hour, int minute, int second);
}
public class implementClass {
public static void main(String[] args) {
//传递参数、返回参数的lamda表达式
Clock clock = (int hour,int minute,int second)->{
String res = hour+":"+minute+":"+second+" ";
System.out.println("现在时间是 "+res);
return res;
};
String getreturn = clock.printTime(12,12,12);
System.out.println("获得的返回值是 "+getreturn);
}
}
lamda表达式可以访问外部变量,但是不能修改外部变量,否则会报错!
interface Car
{
void run();
}
public class implementClass {
public static void main(String[] args) {
int speed = 100;
//测试能够访问的外部变量
Car acar = ()->
{
//能够访问局部变量
System.out.println("车速是"+speed);
};
acar.run();
}
}
这段代码是访问外部变量,所以正常输出了,但是如果修改了外部变量,那么就会报错 Variable used in lambda expression should be final or effectively final