1. 内部类
一个类中内部中定义了一个类B
如:
public class A{public class b{}}
内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部了你要访问内部类成员,必须创建对象
2. 成员内部类
如是公共则可以创建对象
a类名.b类名 i=new a类名().new b类名();
3. 局部内部类
局部类外界是无法直接访问的
需要在内部创建对象并使用
4. 匿名内部类
匿名内部类 是一贯继承了该类或者实现了该接口的子类匿名对象
new 类名或接口名(){重写方法;};
匿名内部类可以直接调用方法 只需要在匿名内部类后调用
new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}}.show(); //匿名内部类需要在匿名内部类后直接调用内部类的方法
匿名内部类本质上也是一个类 但是是匿名无法 直接调用
但我们可以通过多态实现创建对象 来调用
Inter i = new Inter(){ //匿名内部类也可以使用多态创建对象@Overridepublic void show() {System.out.println("匿名内部类");}}; //匿名内部类需要在匿名内部类后直接调用内部类的方法i.show(); //调用方法
如果一个方法需要提供一个接口并使用它,我们可以在方法中直接new一个匿名内部类并重写接口的方法
public void in(Inter inter){inter.show();}Outer op =new Outer();op.in(new Inter() {@Overridepublic void show() {System.out.println("在方法中直接new一个匿名内部类");}});
5. lambda表达式
lambda表达式,我们上面使用直接new一个匿名内部类给这个方法,我们也可以通过lambda表达式直接传一个
使用lambda表达式的前提
- 有一个接口
- 接口中有且仅有一个抽象方法
语法: (参数) -> {重写方法};
public class lambda {public static void main(String[] args) {goswimming(() -> {System.out.println("lambda");});}public static void goswimming(Swimming swimming){swimming.swim();}}interface Swimming { // 要求必须为接口实现void swim(); // 只能有一个抽象方法}
带参无返回值
public class lambda2 {public static void main(String[] args) {useStringHandler(new StringHandler() {@Overridepublic void pringMessage(String msg) {System.out.println("new匿名内部类 " + msg);}});useStringHandler((String msg) -> {System.out.println("lambda传参 " + msg);});}public static void useStringHandler(StringHandler stringHandler) {stringHandler.pringMessage("默认值");}}interface StringHandler {void pringMessage(String msg);}
带返回值的lambda表达式
必须return
import java.util.Random;public class lambda3 {public static void main(String[] args) {useRandomNumHandler(() -> {Random r =new Random();int num = r.nextInt(10)+1;return num;});}public static void useRandomNumHandler(RandomNumHandler randomNumHandler){int result = randomNumHandler.getNumber();System.out.println(result);}}interface RandomNumHandler{int getNumber();}
带参与带返回值
public class lambda4 {public static void main(String[] args) {useCalculator(( a , b) -> a+b);}public static void useCalculator(Calculator calculator){int result = calculator.calc(10,20);System.out.println(result);}}interface Calculator{int calc(int a,int b);}
5.1. lambda表达式的省略
参数类型可以省略,但有多个不同的参数类型时不能省略
如果参数只有一个,则小括号可以省略,没有参数则不能省略必须书写()
如果代码块的语句只有一条,可以省略大括号和分号甚至是return语句
m m,kkhj ;bnhjuo9p[‘inmji0op];[
khJU <KINM]’编译之后会生成一个单独的.class文件
lambda表达式:编译之后,不会生成.class文件,对应的字节码会在运行时动态生成
