Java教程

java进阶四(内部类和Lambda)

本文主要是介绍java进阶四(内部类和Lambda),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

JavaSE进阶第四天

课程大纲:

  • 内部类
  • 匿名内部类 【掌握】
  • Lambda表达式

类的成员位置可以直接定义的内容:

    1、成员变量
    2、构造方法
    3、成员方法
    4、代码块(构造代码块、静态代码块)
    5、成员内部类(内部接口、内部枚举)

一.内部类

1.什么是内部类

一个类定义在另一个类的内部,那么定义在内部的那个类,就是内部类A类定义在B类中,那么A类就是内部类

2.内部类的分类

  成员内部类:定义在成员位置,类中方法外
  局部内部类:定义在局部位置,方法中
  * 匿名内部类是一种特殊的局部内部类

      
     class A {
            // 成员内部类
            class B {

            }

            public void show(){
                // 局部内部类
                class C {

                }
            }
        }    

3. 成员内部类

注意事项:
1.外部类要使用内部类中的成员,不许创建内部类的对象再调用
 创建对象的格式:
 外部类名.内部类名 对象名= new 外部类对象().new 内部类对象();
  A.B ab = new A().new B();

2.内部类可以直接使用所在外部类的成员,即使是私有的
     
    
3.成员内部类也是会生成字节码文件的,字节码文件名称格式:
     外部类名$内部类名.class
         A$B.class
 
4.内部类可以被private和static修饰,被private修饰时,只能在外部类中创建对象来调用内部类里面的方法;
 被static修饰时,只能通过
外部类名.内部类名  对象名 = new 外部类名.内部类名(); 调用;
如果是调用静态内部类里面的静态方法就可以通过
 外部类.内部类.内部类方法();调用

4.局部内部类

  局部内部类只能在其所在的方法中使用,出了方法就无法使用.
  局部内部类也是会生成字节码文件的,字节码文件名称格式:
  外部类名$编号内部类名.class
            A$1B.class
            Outer$1Inner.class
            Outer$2Inner.class
编写位置:方法中
访问方式: 只能在方法中,创建对象并访问

5.匿名内部类

5.1 什么是匿名内部类

是一个没有名字的内部类,而且是局部内部类,意味着匿名内部类都是在方法中使用的

5.2 匿名内部类的使用前提

有一个类或者一个接口

5.3 匿名内部类的格式

  new 父类/接口(){
                // 对父类中的方法重写
                // 或者
                // 对接口中的方法实现
            };

5.4 匿名内部类的原理

 在创建类的子类对象,或者创建接口的实现类对象

5.5 匿名内部类的优点

简化操作,将继承/实现、方法重写、对象创建、调用方法一步搞定

二.Lambda表达式

2.1函数式编程思想

Lambda表达式就是函数式编程思想的一种体现
关注点更加明确,方法具体做什么,省略了其他的复杂语法,能省则省。
JDK8的新特性

2.2 Lambda表达式的作用(优点)

简化代码

2.3 Lambda的标准格式

  () -> {}
 格式解析:
     ():接口中的抽象方法的小括号,方法的形参
     ->:传递的固定符号,将小括号中的形参接收的实参传递给方法体
 	 {}:重写了抽象方法之后的方法体内容
 
     
  Lambda表达式相当于是接口的实现类对象,是简化了匿名内部类

2.4 Lambda的简化格式

使用前提
    1、只能是接口
    2、该接口中有且只有一个抽象方法

    满足以上两个条件的接口:函数式接口
    @FunctionalInterface注解可以检测接口是否是一个函数式接口

    提问:函数式接口中除了仅有的一个抽象方法之外,还能否有默认方法或者静态方法或者私有方法?
    答:其他方法可以任意有,只对抽象方法有要求
    
注意事项:如果Lambda所操作的接口中的方法,有返回值,一定要通过return语句,将结果返回,否则会出现编译错误

2.5 Lambda和匿名内部类的区别

1、使用前提不同

Lambda前提要求是有一个接口,而且要求接口中的抽象方法有且只有一个(要求是函数式接口)
匿名内部类前提要求是有一个类或者接口,对接口中的抽象方法的个数没有要求

2、字节码文件不同

Lambda不会生成字节码文件的,在运行的过程中在内存里动态生成,在硬盘中没有
匿名内部类会生成字节码文件,在硬盘上可以看到这个字节码文件
这篇关于java进阶四(内部类和Lambda)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!