内部类

类中可以存在一个类!各种各样的长相怪异的代码就是从这里开始出现的!

成员内部类

我们的类中可以在嵌套一个类:

  1. public class Test {
  2. class Inner{ //类中定义的一个内部类
  3. }
  4. }

成员内部类和成员变量和成员方法一样,都是属于对象的,也就是说,必须存在外部对象,才能创建内部类的对象!

  1. public static void main(String[] args) {
  2. Test test = new Test();
  3. Test.Inner inner = test.new Inner(); //写法有那么一丝怪异,但是没毛病!
  4. }

静态内部类

静态内部类其实就和类中的静态变量和静态方法一样,是属于类拥有的,我们可以直接通过类名.去访问:

  1. public class Test {
  2. static class Inner{
  3. }
  4. }
  5. public static void main(String[] args) {
  6. Test.Inner inner = new Test.Inner(); //不用再创建外部类对象了!
  7. }

局部内部类

对,你没猜错,就是和局部变量一样哒~

  1. public class Test {
  2. public void test(){
  3. class Inner{
  4. }
  5. Inner inner = new Inner();
  6. }
  7. }

反正我是没用过!内部类 -> 累不累 -> 反正我累了!

匿名内部类

匿名内部类才是我们的重点,也是实现lambda表达式的原理!匿名内部类其实就是在new的时候,直接对接口或是抽象类的实现:

  1. public static void main(String[] args) {
  2. Eat eat = new Eat() {
  3. @Override
  4. public void eat() {
  5. //DO something...
  6. }
  7. };
  8. }

我们不用单独去创建一个类来实现,而是可以直接在new的时候写对应的实现!但是,这样写,无法实现复用,只能在这里使用!

lambda表达式

读作λ表达式,它其实就是我们接口匿名实现的简化,比如说:

public static void main(String[] args) {
        Eat eat = new Eat() {
            @Override
            public void eat() {
                //DO something...
            }
        };
    }

public static void main(String[] args) {
        Eat eat = () -> {};   //等价于上述内容
    }

lambda表达式(匿名内部类)只能访问外部的final类型或是隐式final类型的局部变量!

为了方便,JDK默认就为我们提供了专门写函数式的接口,这里只介绍Consumer