内部类
含义:类中定义类。
分类:
1.成员内部类
2.私有内部类
3静态内部类
4.局部内部类
5.匿名内部类
其中匿名内部类我们用的最多。
1.成员内部类:内部类定义在外部类的成员位置。
可以使用成员修饰符,public……static……
2.私有内部类:被private修饰的内部类。
私有内部类只能在当前的类中使用。
3.静态内部类:被static修饰的内部类。
1.静态内部类中可以定义静态的内容。
2.静态类不能直接调用外部类的成员,要创建外部类的对象。
4.局部内部类:内部类定义在局部的位置。
1.不可以使用成员修饰符public……static……修饰(final不是成员修饰符)。
2.只能在所定义的方法中使用。
3.如果定义的内部类中的方法有参数,此参数必须被final修饰,jdk1.7之前必须显示定义,1.8之后可省略,默认被final修饰。
public class Demo{
//成员内部类
public class A{
}
//私有内部类
private class B{
}
//静态内部类
static class C{
}
//成员方法
public void test(){
//局部内部类
class D{
}
}
}
5.匿名内部类:
当一些类没有自己的作用,只是对有些方法进行重写,可以简略的使用匿名内部类的形式。
public class Demo02 {
public static void main(String[] args) {
//new Test().smoke();
//匿名内部类 new的是实现类的对象
//直接调用 只能使用一次,不能复用
new Smoking(){//实现类的类体|子类的类体-->继承|实现了 前面的接口|父类 eg:Smoking
@Override
public void smoke() {
System.out.println("不会吐烟圈的吸烟人都是辣鸡!!!");
}
}..smoke();
//引用调用 接口多态
Smoking s=new Smoking(){
@Override
public void smoke() {
System.out.println("不会吐烟圈的吸烟人都是辣鸡!!!");
}
};
s.smoke();
}
}
//定义接口
interface Smoking{
void smoke();
}
jdk1.8之后为了防止过多的内部类使得代码反锁,有了Lambda表达式,可以简化内部类。
Lambda表达式使用前提:
必须是函数式接口(只有一个抽象方法的接口)。
@FunctionalInterface强制检查是否为一个函数式接口
Lambda表达式基本格式:
() - > {}
():方法参数列表
-> 箭头函数|箭头符号 上下文推导
{} 抽象方法的方法体
public class LambdaDemo {
public static void main(String[] args) {
//匿名内部类的一般使用
/*Swimming s=new Swimming(){
@Override
public void swim() {
System.out.println("淹死会水的...");
}
};
s.swim();
*/
//Lambda表达式语法1
//Swimming s=()->{System.out.println("淹死会水的...");};
//语法2 如果语句体只有一句,前后的{}是可以省略的
//Swimming s=()->System.out.println("淹死会水的...");
//语法3 如果存在方法的参数,()中的参数数据类型可以省略
//Swimming s=(x)->System.out.println("淹死会水的...");
//语法4 如果存在方法的参数,()中的参数有1个,参数的()可以省略,参数有多个不可以省略
//Swimming s= x ->System.out.println("淹死会水的...");
//语法5 如果语句体只有一句,并且是一个return 返回值语句,return与语句体{}可以一起省略
Swimming s= x -> x+10;
System.out.println(s.swim(5));
}
//函数式接口
@FunctionalInterface
interface Swimming{
int swim(int x);
}