内部类:一个类定义在另一个类类体中,这样内部类就可以直接使用外部类的相关内容了
成员内部类:把一个类当做外部类的成员存在,和属性方法是同级的
public class Outer {
public class Inter {
//直接调用外部类的成员
//内部类不可以定义静态属性,除非是静态常量(static final)
//如果和外部类属性同名,访问时遵循就近原则,访问外部类属性时需要使用(外部类.this.属性)
}
}
//实例化内部类:通过外部类实例化
//Outer.Inter inter = Outer.new Inter();
//成员内部类的实例化方法过于复杂,所以一般会在外部类声明一个私有化的内部类成员,将内部类访问修饰符变为私有的,并提供一个公开的方法调用内部类
public class Outer {
private Inter inter;
private class Inter {
public void Go(){
System.out.println("我是内部类");
}
}
public void interMethod(){
inter = new Inter();
inter.Go();
}
}
静态内部类:静态的成员内部类
public Outer {
public static class Inter {
private static int i = 10;
private static void Go(){
System.out.println("我是静态内部类的静态属性i=" + i);
//静态内部类的静态方法规则和外部类一样
//静态内部类可以直接当做外部类实例化调用
}
}
}
局部内部内:将内部类定义在成员方法体内
public Outer {
public void Go(){
class Inter {
//不能有静态属性
public void go(){
}
}
//创建局部内部类对象调用方法
}
}
匿名内部类(重要):
匿名内部类就是没有名字的局部内部类
public interface Inter {
void Go();
}
public class Outer {
public static void main(String[] args){
//JDK8.0之前
Inter inter = new Inter(){
@Override
public void Go(){
System.out.println("我是匿名内部类");
}
}
//JDK8.0之后
//使用lambda表达式
//(参数)->{语句};
public static Inter getInter(){
return ()->{语句1;语句2;...};
//如果{}中只有一行代码则{}可以省略
}
Inter inter = ()->语句;
}
}