Java之内部类、匿名内部类、Lambda表达式和方法引用
1.内部类
内部类顾名思义就是一个类里面再次定义一个类,这样做有好处也有坏处,好处是如果使用了内部类,那么这两个类之间的通信将会十分轻松。比如私有属性传递,但是缺点也很明显,就是内部类会导致类的结构复杂化。
内部类访问外部类私有化属性,方法的格式 与其实例化过程:
实例化过程
外部类.内部类 对象名称= new 外部类().内部类()
访问外部私有属性和方法等
str = 外部类.this.str
当实现static定义内部类时候,其访问外部类的属性方法的格式和实例化过程:
1.实例化过程
外部类.内部类 实例化对象名称 = new 外部类.内部类();
2.访问外部私有属性和方法
str = 外部类.str
注意:可以直接访问外部类的静态成员(包括静态属性和静态方法),但不能直接访问外部类的非静态成员(非静态属性和非静态方法)。
两者的区别:
1.当用static定义内部类时候,那么内部类其实就是一个独立的个体了所以可以不需要实例化其外部类就嗯呢更直接实例化内部类
除了内部类还可以有内部接口,接口内部实现抽象类,接口子类定义内部类
1.内部接口:
2.接口内部实现抽象类
3.接口子类定义内部类
4.方法种定义内部类
虽然一般内部类在类的哪里都可以进行定义,到那时,一般情况下,内部类都是定义在外部类的方法里面

2.匿名内部类
问题引出:由于一般情况下一个public类对应一个.java文件,那么如果类功能简单情况下,很多的类下就会产生大量的java类文件。所以通过匿名内部类可以不产生子类,就能完成子类带来的功能。
(重点掌握)3.Lambda表达式
匿名内部类由于其实现是比较复杂的,所以就诞生了Lambda表达式,这种表达式极大的简化的匿名内部类的操作
实现Lambda的语法有两种:
1.()->{方法体}
Runnable runnable = () -> {
System.out.println("Hello, world!");
};
2.()->语句
Calculator calculator = (a, b) -> a + b;
@FunctionInterface注解
表示函数式接口,接口内只能出现一种抽象类方法

4.方法引用
引用并不陌生,在以前的java的实例中就有着大量的引用,但是引用的大部分都是实例化对象,或者引用值,这里是对方法的引用。方法的引用分为三类:引用静态方法 引用某个对象的方法 引用特定类型的方法 引用构造方法
方法引用有以下四种:
引用静态方法 : 类名称::static方法名称
引用某个对象的方法 : 实例化对象::普通方法
引用特定类型的方法 : 特定类::普通方法
引用构造方法: 类名称::new