目录
一、匿名内部类
当方法的形参为接口类型,我们传入的应该是该接口的实现类对象
为了调用useInter(参数是接口)这个方法,一般步骤(不用匿名内部类):
编写一个类实现接口
重写show方法
创建实现类对象传入方法里
如下方代码:
//测试
package csdn;
public class test1 {
public static void main(String[] args) {
//形参是接口类型,接口无法实例化,传入该接口的实现类对象
useInter(new am());//am是实现Inter接口的类
}
public static void useInter(Inter a){
a.show();
}
}
package csdn;
public interface Inter {
void show();
}
package csdn;
public class am implements Inter {
@Override
public void show() {
System.out.println("我热爱学习!!!");
}
}
使用匿名内部类
接口中的方法不多时,可以使得代码更加简洁,在定义类的时候对其进行实例化
格式:
new 类名\接口名(){
}
new 类名(){}:代表继承这个类
new 接口名(){}:代表实现这个接口
//测试
package csdn;
public class test1 {
public static void main(String[] args) {
//形参是接口类型,接口无法实例化,传入该接口的实现类对象
useInter(new Inter() {
@Override
public void show() {
System.out.println("匿名内部类,重写的show方法");
}
});
}
public static void useInter(Inter a){
a.show();
}
}
二、Lambda表达式
Lambda表达式的简化格式:
()->{}
(函数内部类被重写方法的形参列表)->{
被重写方法的方法体代码
}
其中->是语法形式,没有实际含义
Lambda表达式,只允许操作函数式编程接口(有且仅有一个抽象方法的接口)
代码如下(示例):
//测试
package csdn;
public class test1 {
public static void main(String[] args) {
//形参是接口类型,接口无法实例化,传入该接口的实现类对象
useInter(new Inter() {
@Override
public void show() {
System.out.println("匿名内部类,重写的show方法");
}
});
System.out.println("------------------------------------");
//用lambda表达式简化匿名内部类
useInter(() -> System.out.println("匿名内部类,重写的show方法"));
}
public static void useInter(Inter a){
a.show();
}
}
可以用@FunctionalInterface校验是不是函数式接口
package csdn;
@FunctionalInterface//是函数式接口,不会报错
public interface Inter {
void show();
}
package csdn;
@FunctionalInterface//会报错
public interface Inter {
void show();
void show1();
}
package dome2;
public class test {
public static void main(String[] args) {
A dog1 = new dog();
dog1.feed();
System.out.println("-------------------");
A dog2 = new A() {
//A dog2=new A; 是错误的,因为接口不能实例化
public void feed () {
System.out.println("小狗喜欢吃骨头!!");
}
};
dog2.feed();
System.out.println("--------------------");
A dog3=()->System.out.println("小狗超级喜欢吃骨头!!");
dog3.feed();
//将函数作为一个方法的参数
System.out.println("---------------------");
}
}