Lambda表达式:
匿名内部类:
接口A:
public interface A {
public abstract void method1();
public abstract void method2();
}
public class text {
public static void main(String[] args){
//匿名内部类创建匿名对象使用方法
int a=0;
new A(){
@Override
public void method1() { //绝不能省略pbulic,否则就不是重写
System.out.println("匿名内部类");
}
@Override
public void method2() {
}
}.method1();
}
}
本来是有类去实现A,再去重写,创建类,再去使用;
匿名内部类是直接使用接口创建匿名对象,创建的时候创建匿名内部类(相当于B)重写A;
(注意:如果内部类的方法去调用外部类的变量,该变量一定要是final的,当被内部类的方法访问时,外部类会被编译成与方法同等级,内部类会将数据备份一份在自己的空间(通过常量池或者是构造方法),如果内部类对该变量进行了操作的时候,其实是对备份进行操作,也就是说你在对一个你无法查看的值进行操作,没有意义,所以必须加上final保证语义上和数值访问上的一致性。参考链接:深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量_制心入境-CSDN博客)
Lambda表达式:
(主要思想就是利用其他已有方法去实现函数式接口的方法)
Lambda表达式详解 - 海向 - 博客园 (cnblogs.com)
上面链接已经很详细易懂:
主要解释方法引用与构造方法引用:
public class asaad {
asaad(int a){
}
interface A{
asaad A1(int a);
}
interface B{
void B1(int a);
}
public static void B2(int a){
System.out.println("静态方法引用");
}
public void B3(int a){
System.out.println("动态方法引用");
}
public static void main(String[] args) {
int q=0;
A a = asaad::new; //构造方法引用
asaad s = a.A1(q);
//B b = asaad->System.out.println("静态方法引用");
B b = asaad::B2; //静态方法的调用
b.B1(q);
asaad a1 = new asaad(q);//动态方法的调用
//B b1 = asaad->System.out.println("动态方法引用");
B b1 = a1::B3;
b1.B1(q);
}
}
方法的引用:其实也是去实现接口方法,利用某类已有的方法去实现这个接口方法,方式:某类的名称::已经实现的方法名称;
(注意返回值类型与参数类型需要一致,如果采用的是动态方法则需要使用某类的实例对象::已有的方法名)
构造方法的引用:其实也是去实现接口方法,只是是利用某类的已有构造方法的创建类的方法去实现这个接口方法,并且方式是(对应返回值类型的类)某类的名称::new;
如果是多参构造,则加构造方法和接口方法的参数要一样;