1. 定义
定义在一个类中的类
2. 使用时机
- 当一个类需要用到另一个类,并且两个类的联系比较密切时就需要使用内部类
- 内部类可以访问外部类的私有成员,这样可以将相关的类和接口隐藏在外部类的内部,提高封装性
- 匿名内部类是没有名字的类,通常用于定义一个只使用一次的类
3. 分类
3.1 静态内部类
可以当做静态变量来看
//静态内部类
public class OuterClass{private static int i = 0;private int j = 100;public static void m1() {System.out.println("m1");}public void m2() {System.out.println("m2");}//静态内部类//四种访问控制权限修饰符在这里都可以使用private static class InnerClass {public void m3() {System.out.println(i); //可以访问System.out.println(j); //不可以访问m1(); //可以访问m2(); //不可以访问}}
}
注意点:无法直接访问外部类中实例变量和实例方法
如何使用: OuterClass.InnerClass oi = new OuterClass.InnerClass ();
3.2 实例内部类
可以当做实例变量来看
//实例内部类
public class OuterClass{private static int i = 0;private int j = 100;public static void m1() {System.out.println("m1");}public void m2() {System.out.println("m2");}//静态内部类//四种访问控制权限修饰符在这里都可以使用private class InnerClass {public void m3() {System.out.println(i); //可以访问System.out.println(j); //可以访问m1(); //可以访问m2(); //可以访问}}
}
注意点:可以直接访问外部类中所有的实例变量,实例方法,静态变量,静态方法
如何使用: OuterClass.InnerClass oi = new OuterClass().new InnerClass ();
3.3 局部内部类
可以当做局部变量来看
//局部内部类
public class OuterClass{private static int i = 0;private int j = 100;public void m1() {//局部变量int i = 11;//局部内部类class InnerClass {public void m2() {System.out.println(i); //可以访问System.out.println(j); //可以访问}}//new 对象InnerClass ic = new InnerClass();ic.m2();}public static void m3() {int i = 11;//局部内部类//这里的内部类的类名可以和上面相同的原因是属于局部,就和局部变量一样,出了大括号之后就没了class InnerClass {public void m2() {System.out.println(i); //可以访问System.out.println(j); //不可以访问}}}
}
注意点:
- 局部内部类方外类外部的局部变量时,局部变量需要被final修饰
- 不能使用访问权限控制符修饰,因为只是在局部访问,外部不需要访问,添加这些修饰符也没有什么用
- 从JDK8开始,不需要手动添加final了,但JVM会自动添加
3.4 匿名内部类
特殊的局部内部类,没有名字,只可以使用一次
//匿名内部类
public class test {public static void main(String[] args) {Computer c = new Computer();c.conn(new Usb() {@Overridepublic void read() {System.out.println("read");}@Overridepublic void write() {System.out.println("write");}});}
}class Computer {public void conn(Usb usb) {usb.read();usb.write();}
}interface Usb {void read();void write();
}