Java核心类库――内部类那点事儿 (二)

2014-11-24 07:45:44 · 作者: · 浏览: 2
plements Comparator{
25 public int compare(String o1,String o2){
26 return o1.length()-o2.length();
27 }
28 }
29 }
30
31 }


4)匿名内部类
 顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
  匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
   只用到类的一个实例。
   类在定义后马上用到。
   类非常小(SUN推荐是在4行代码以下)
   给类命名并不会导致你的代码更容易被理解
  在使用匿名内部类时,要记住以下几个原则:
   匿名内部类不能有构造方法。
   匿名内部类不能定义任何静态成员、方法和类。
   匿名内部类不能是public,protected,private,static。
   只能创建匿名内部类的一个实例。
   一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
   因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
A、继承式的匿名内部类和接口式的匿名内部类。
1 import java.util.Arrays;
2 import java.util.Comparator;
3
4 /**匿名内部类 语法*/
5 public class AnnInnerClass {
6
7 public static void main(String[] args) {
8 // TODO Auto-generated method stub
9 Yoo yoo = new Yoo();//创建Yoo的实例
10 Yoo y1 = new Yoo(){};
11 //new Yoo(){}创建匿名类实例
12 //匿名类new Yoo(){}是继承Yoo类,并且同时创建了对象
13 //new Yoo(){}是Yoo的子类型,其中{}是类体(class Body)
14 //类体中可以定义任何类内的语法,如:属性,方法,方法重载,方法覆盖,等
15 //子类型没有名字,所以叫匿名类!
16 Yoo y2 = new Yoo(){
17 public String toString(){//方法重写(覆盖)
18 return "y2"; //y2是子类的实例
19 }
20 };
21 System.out.println(y2);//"y2",调用了匿名类对象toString()
22 //匿名内部类可以继承/实现 于 类,抽象类,接口等
23 //按照继承的语法,子类型必须实现所有的抽象方法
24
25 //Xoo x = new Xoo(){};//编译错误,没有实现方法
26 final int b = 5;
27 Xoo xoo = new Xoo(){ //是实现接口,并且创建匿名类实例,不是创建接口对象
28 public int add(int a){//实现接口中的抽象方法
29 return a+b; //要访问局部变量b,只能访问final变量
30 }
31 };
32 System.out.println(xoo.add(5));//10,调用对象的方法
33 //Comparator接口也可以使用匿名类的方式
34 Comparator byLength = new Comparator(){
35 public int compare(String o1,String o2){
36 return o1.length()-o2.length();
37
38 }
39 };
40 String[] names = {"Andy","Tom","Jerry"};
41 Arrays.sort(names,byLength);
42 System.out.println(Arrays.toString(names));
43 //也可以这样写,工作中常用
44 Arrays.sort(names,new Comparator(){
45 public int compare(String o1,String o2){
46 return o1.length()-o2.length();
47 }
48 });
49 }
50
51 }
接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

B。参数式的匿名内部类。

1 class Bar{   
2 void doStuff(Foo f){
3 }   
4 }   
5 interface Foo{   
6 void foo();   
7 }   
8 class Test{  
9  static void go(){  
10  Bar b = new Bar();  
11  b.doStuff(new Foo(){  
12  public void foo(){  
13  System.out.println("foofy");  
14  }   
15 });
16  }   
17 }



构造内部类对象的方法有:
1、内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:
(1)OuterClass out = new OuterClass();
OuterClass.InnerClass in = out.new InnerClass();
(2)OuterClass.InnerClass in=new OuterClass().new InnerClass();
其中OuterClass是外部类,InnerClass是内部类。
2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:
InnerClass in = new InnerClass();
3、如果内部类为静态类,则可用如下形式来构造函数:
OuterClass.InnerClass in = new OuterClass.InnerClass();
无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。


摘自 只是小人物