1.成员内部类
是指把内部类当作外部类的一个“成员”(属性/方法)看待
特点:
- 可以访问外部类的所有成员。
- 如果成员内部类中有属性与外部类的属性同名,则需要通过外部类.this.同名属性来访问外部类的同名属性。
- 如果成员内部类是公开的,则在其他类中,可以通过如下方式来创建成员内部类的对象:
外部类.内部类 变量名 = 外部对象.new 内部类名
私有化成员内部类,再提供一个方法来创建内部类对象并调用,通过调用该方法来使用该类
public class Outer {
private int id = 1;
private static int guid = 10;
public void createMemeberInnerClass() {
MemberInnerClass mic = new MemberInnerClass();
mic.memberInnerMethod();
}
private class MemberInnerClass {
private int id = 2;
private static final int guid = 20;
public void memberInnerMethod() {
System.out.println(id);
System.out.println(guid);
System.out.println("外部类的id: " + Outer.this.id);
System.out.println("外部类的guid: " + Outer.guid);
}
}
}
2.静态内部类
是指把内部类当做外部类的"静态成员"存在
特点:
- 可以直接访问所在外部类的所有静态成员
- 创建静态内部类对象的语法:
StaticInner staticInner = new 外部类.StaticInner(); - 如果是公开的静态内部类,可以"上升"为顶级类:
StaticInner staticInner = new StaticInner();
直接创建该类对象使用即可
public class Outer {
private int id = 1;
private static int guid = 10;
public static class StaticInnerClass {
private int id = 3;
private static int guid = 30;
public void staticInnerMethod() {
System.out.println(id);
System.out.println(guid);
System.out.println("外部类的id: " + new Outer().id);
System.out.println("外部类的guid: " + Outer.guid);
}
}
}
3.局部内部类
是指把内部类定义在外部类的成员方法中
特点:
- 可以访问外部类的所有成员
- 也可以访问所在方法中的final变量
- 这个类只能在定义它的方法中使用
在其所在成员方法中创建该类对象.方法,通过调用该成员方法使用该类
public class Outer {
private int id = 1;
private static int guid = 10;
public void outerMethod() {
class LocalInnerClass {
private int id = 4;
private static final int guid = 40;
public void localInnerMethod() {
System.out.println(id);
System.out.println(guid);
System.out.println("外部类的id: " + Outer.this.id);
System.out.println("外部类的guid: " + Outer.guid);
}
}
new LocalInnerClass().localInnerMethod();
}
}
4.匿名内部类
本质上是没有名字的局部内部类
把名字去掉相当于new接口,调用方法来使用
public class Outer {
public void outerMethod2() {
new IA() {
@Override
public void ia() {
System.out.println("匿名内部类");
}
}.ia();
// Lambda表达式
/*IA ia = () -> System.out.println("匿名内部类");
ia.ia();*/
}
}
interface IA {
void ia();
}
注意
成员内部类和局部内部类都不能有静态属性,常量除外。
局部内部类的修饰符不能是public / static 。