内部类和lambda表达式
文章目录
内部类
概念
在一个类的内部又定义了一个类,此时内部的类就是内部类;(类中类)
访问特点
(1).内部类可以直接访问外部类的成员,包括私有
(2).外部类要访问内部类的成员,必须创建对象
成员内部类
放在了成员变量位置
创建对象格式:外部类名.内部类名 对象名=外部类对象.内部类对象;
或者
局部内部类
局部内部类是在方法中定义的类,所有外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以方法内的局部变量
创建对象格式:内部类 对象名=new 内部类;
注意:只能在外部类的方法中创建对象
匿名内部类
概念
在一个外部类的方法中创建了一个没有名字的某个类的子类对象,就是匿名内部类;
说白了就是一个继承了该类的子类匿名对象,或者是一个实现了该接口的实现类匿名对象
前提
存在一个类或者接口,这里的类可以是具体类也可以是抽象类
匿名对象
创建了对象之后,没有给对象起名字
区别
匿名内部类创建出来的对象如果没有起名字,则是匿名对象,如果创建出来的对象起名字了,则不是匿名对象;
语法格式
new 父类名(){重写方法的内容}
使用建议
(1).如果创建出来的匿名内部类只使用一次,建议直接用这个对象调用方法即可
(2).如果创建出来的匿名内部类多次使用,必须给这个对象起个名字,以多态的形式保存下来
lambda表达式
概述
函数式编程思想,强调的是最终要做的事情,而不再让我们关注编写类,类的关系,创建对象的过程;
使用前提
(1).方法的参数必须是接口类型且接口中有且仅有一个抽象方法需要实现类重写;
(2).只有在调用方法的时候,吧lambda作为一个实参进行传递或作为方法的返回值进行返回时才可以使用;
实现理念
凡是可以推导出来的,都可以省略不写
语法格式
(仿照接口的方法的参数类型) ->{要做的事情}
格式:(形式参数) -> {代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
->:由英文中划线和大于符号组成,固定写法。代表指向动作
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
小结:拿着形式参数去做代码块中的事情
省略格式
(1).参数的数据类型可以省略不写
(2).当参数类型只有一个时,小括号可以省略
(3).当方法体只有一行语句时,可以省略大括号,分号,甚至是return;
lambda表达式与匿名内部类的区别
(1).所需类型不同:
匿名内部类:可以是接口,也可以是抽象类,还可以是具体的类(只要不是final的类都可以使用)
lambda表达式:只能是接口,且接口中有且仅有一个抽象类需要重写
(2).使用限制不同:
如果接口中仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类;
如果接口中有多个抽象方法,只能使用匿名内部类,不能使用lambda表达式
(3).实现原理不同
匿名内部类:编译之后,产生一个单独的.class字节码为文件
lambda表达式:编译之后,.class字节码文件只会在运行时动态生成,用完及删