组成:
1)成员内部类:非静态内部类,静态内部类 2)局部内部类 3)匿名内部类
用途:
1)访问外部类的所有成员(private) 2)多重继承 3)封装类型 4)编写事件驱动程序 5)回调
代码展示:
非静态内部类:
/** * 实例内部类 */ public class Inner { public String name = "内部类"; public void show() { System.out.println("我是外部类的name:" + Outer.this.name); System.out.println("我是内部类的name:" + name); } }
静态内部类
/** * 静态内部类 */ public static class SubInner { public static String name = "asdf"; public static void show(){ System.out.println("内部类2显示:"+Outer.name2); System.out.println("内部类2显示:"+new Outer().name); } }
匿名类:需要注意的是,匿名类必须继承一个类或者借口且只能是一个
/** * 匿名内部类 */ public class OuterOfAnonymous { /** * Printer是一个类 */ static Printer printer = new Printer(){ @Override public void print() { System.out.println("我可以进行打印"); } }; public static void main(String[] args) { /** * Flyable是一个接口,必须实现接口的方法 */ Flyable flyable = new Flyable(){ @Override public void fly() { System.out.println("我可以飞"); } }; printer.print(); flyable.fly(); } }
回调:类实现了某种功能,但没有直接提供接口,调用时可以用这个类的内部类的接口实现该功能。内部类没有提供实现,调用了外部类的实现
package out; public class Bird extends Animal { public void move() { System.out.println("我是小鸟可以用腿走"); } static void fly() { System.out.println("我是小鸟还可以飞"); } private static Flyable flyable = new Flyable() { @Override public void move() { System.out.println("调用一下回调"); fly(); } }; public static void main(String[] args) { Bird bird = new Bird(); bird.move(); flyable.move(); } }