匿名内部类是内部类的简写格式, 其实就是一个匿名子类对象。使用匿名内部类必须继承或实现一个类或者接口。格式:new 父类或者接口(){子类内容};
1 //定义匿名内部类实例一 2 public class InnerClassDome { 3 public static void main(String[] args) 4 { 5 Outer outer = new Outer(); 6 outer.method(); 7 } 8 } 9 10 abstract class Demo 11 { 12 abstract void show(); 13 } 14 15 class Outer 16 { 17 private int num = 3; 18 /*class Inner extends Demo 19 { 20 void show() 21 { 22 System.out.println("show ..."); 23 } 24 }*/ 25 public void method() 26 { 27 //new Inner().show(); 28 //下面就是匿名内部类的格式 29 new Demo() 30 { 31 @Override 32 void show() { 33 System.out.println("show ..."); 34 } 35 }.show(); 36 } 37 }
1 //定义匿名内部类实例二 2 public class InnerClassDome { 3 public static void main(String[] args) 4 { 5 new Outer().method(); 6 } 7 } 8 9 interface Demo 10 { 11 public abstract void show1(); 12 public abstract void show2(); 13 } 14 15 class Outer 16 { 17 public void method() 18 { 19 Demo demo = new Demo() 20 { 21 @Override 22 public void show1() { 23 System.out.println("show1 ... "); 24 } 25 26 @Override 27 public void show2() { 28 System.out.println("show2 ... "); 29 } 30 }; 31 demo.show1(); 32 demo.show2(); 33 } 34 }
使用场景
当函数参数是接口类型是,而且接口中的方法超不过三个,可以用匿名内部类作为时间参数进行传递。
1 public class InnerClassDome { 2 public static void main(String[] args) 3 { 4 show(new Inter() { 5 @Override 6 public void show1() { 7 System.out.println("show1 ... "); 8 } 9 10 @Override 11 public void show2() { 12 System.out.println("show2 ..."); 13 } 14 }); 15 } 16 17 public static void show(Inter inter) 18 { 19 inter.show1(); 20 inter.show2(); 21 } 22 } 23 24 interface Inter 25 { 26 public abstract void show1(); 27 public abstract void show2(); 28 }
匿名内部类细节
1 //细节一:主函数不可调用非静态的匿名内部类,想调用必须给匿名内部类加上static 2 class InnerClassDemo 3 { 4 class Inner 5 { 6 } 7 8 public static void main(string[] args) 9 { 10 //new Inner();//这里会报错 11 } 12 13 public void method() 14 { 15 new Inner(); 16 } 17 }
1 //细节二:所有子类都默认继承Object,但不能实例成一个匿名内部类 2 //会报错的程序 3 class Outer 4 { 5 void method() 6 { 7 Object obj = new Object(){ 8 public void show() 9 { 10 System.out.println("show..."); 11 } 12 }; 13 obj.show();//因为匿名内部类这个子类对象被向上转型为object类型 14 //这样就不能在使用子类特有的方法了. 15 } 16 }