内部类存在的原因
成员内部类
什么是成员内部类?
在外部类中不使用static关键字定义的类就是成员内部类
成员内部可以类比为外部类的成员属性和成员方法.
先有外部类,才能有内部类.
在成员内部类中可以访问外部类所有的成员,包括成员变量和成员方法.但是不能自己定义静态变量和静态方法,同样外部类也可以访问内部类的所有变量和方法.
成员内部类产生对象的方式
Outter.Inner inner = new Outter().new Inner();
方法内部类
方法内部类,也被称为局部内部类,就是定义在某个局部范围内的类,它和局部变量一样,都是在方法内部定义的,作用范围只限于方法内部.
静态内部类
成员内部类和静态内部类的区别:
匿名内部类
在java中调用某个方法时,如果方法的参数是一个接口,除了可以传入一个参数接口实现类,还可以使用匿名内部类实现接口来作为该方法的参数,匿名内部类其实就是没有名称的内部类,在调用带有接口参数的方法时,通常不会真的去创建一个类,而是通过匿名内部类的方式,在匿名内部类中直接实现接口.
Lambda表达式
在JDK8之前,接口中只有全局常量和抽象方法,如果我想在接口中拓展一个方法,那么之前使用过这个接口的所有类都要实现这个方法,于是,java开发者在接口中拓展了普通方法,并用default来修饰.
函数式接口
- 一个接口有且只有一个抽象方法,这种接口称为函数式接口
@FunctionalInterface
检查当前接口是否是函数式接口(当前接口是否是抽象方法,有且只有一个.)- 函数式接口可以存在普通方法.
package innerClass;
/**
* @autor hh
* @date 2022/06/16 17:42
*/
@FunctionalInterface
public interface NewInterface {
void show();
//普通方法
default void test(){
System.out.println("这是一个普通方法,不影响函数式接口的定义");
}
}
Lambda表达式的前身其实就是匿名内部类