一.内部类:在一个类中再定义一个类
1.成员内部类
private;
私有成员内部类:在自己所在的外部类中创建独享访问。通过在外部类中创建method方法,在主函数中创建对象调用method方法来实现对私有内部类的访问。
public static void main(String[] args){
Outer o=new Outer();
o.method();
}
class Outer {//外部类
private class Inner {//内部类
public void show() {
System.out.println("inner...show");
}
}
public void method(){
Inner I=new Inner();
I.show();
}
static;
静态成员内部类访问格式:外部类名.内部类名 对象名=new 外部内名.内部类名();
静态成员中的内部类方法:外部类名.内部类名.方法;
局部内部类:在方法中定义的类。外界无法访问,需要在方法内部创建对象并使用。该类可以直 接访问外部类的成员,也可以访问方法内部的局部变量。
public class Test4Innerclass {
/*
局部内部类
编写位置:方法中
访问方式;只能在方法中,创建对象并访问
*/
public static void main(String[] args) {
Outer o=new Outer();
o.method();;
}
}
class Outer{//外部类
public void method(){//外部内中的成员方法
class Inner{//局部内部类,定义在外部类的成员方法
public void show(){
System.out.println("show...");
}
}
//在外部类的方法中创建对象,用该方法调用内部类中的方法
Inner i=new Inner();
i.show();;
}
}
匿名内部类:匿名内部类本质上是一个特殊的局部内部类(定义在方法中)(掌握)
将继承,重写,实现放在一步。
作用:当方法的形式参数是接口或抽象类时,可以将匿名内部类作为实际参数传进去
二,Lambda表达式(函数式接口)
设置格式:(形式参数) -> {代码块}
形式参数:如果有多个参数,用逗号隔开,如果没有参数留空即可
使用前提:1)有一个接口 2)接口中有且仅有一个抽象方法
Lambda表达式省略模式:1)参数类型可以省略,但是多个参数的情况下,不能只省略一个
2)如果参数有且仅有一个,那么小括号可以省略
3)如果代码块只有一条,可以省略大括号和分号,甚至是return
三.Lambda和匿名内部类的区别
1.所属类型不同:
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda:只能是接口
2.使用限制不同
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多余一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3. 实现原理不同
匿名内部类在编译后可以单独生成一个 .class字节码文件
Lambda表达式:编译后,没有一个单独的class字节码文件,对应的字节码会在运行的时候 动态生成