Java匿名内部类相关
匿名内部类的前提:内部类可以处于成员位置上。
1 class Outer 2 { 3 int x=3; 4 void method() 5 { 6 class Inner 7 { 8 void function() 9 { 10 System.out.print(Outer.this.x); 11 } 12 } 13 } 14 } 15
匿名内部类只是一种简写格式:
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口。
3.匿名内部类的格式:
1 new 父类或者子类接口() 2 { 3 定义子类内容; 4 }
4.其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖。可以理解为带内容的对象。
1 class Outer 2 { 3 int x = 3; 4 5 class Inner extends AbsDemo//正常写法,若是想匿名写就必须继承或者实现一个接口 6 { 7 void show() 8 { 9 System.out.print("show:" + x); 10 } 11 } 12 13 public void function() 14 { 15 new Inner().show(); 16 } 17 } 18 abstract class AbsDemo 19 { 20 abstract void show(); 21 } 22 23 class Outer 24 { 25 int x = 3; 26 27 public void function() 28 { 29 /* 30 * 与new Inner().show(); 相比,下面的相当于把Inner替换了, 31 * 但是没有Inner类,所以调用其父类,父类中含有抽象方法, 32 * 所以要先去实现。建立对象之后,调用对象的的方法.show() 也就理所当然了。 33 */ 34 new AbsDemo() // 匿名内部类 35 { 36 @Override 37 void show() 38 { 39 System.out.print("x==" + x); 40 } 41 }.show(); 42 } 43 }
5.如果你匿名内部类里面覆盖和(或)定义了两个以上的方法,就不能用匿名的方式了,因为匿名的只能调用一次。所以要是想用两个方法,就得起个名儿。
1 AbsDemo a = new AbsDemo() // 匿名内部类 2 { 3 @Override 4 void show() 5 { 6 System.out.print("x==" + x); 7 } 8 };
注意,AbsDemo是父类,建立的a是子类对象,这不就是多态嘛。
但是在调用的时候
1 a.show();//这个问题不大 2 a.abc();//这个就编译不过去了,父类根本就没有abc方法。