Java核心类库:内部类那点事儿-2

上一篇 / 下一篇  2012-04-18 14:36:40 / 个人分类:Java

4)匿名内部类

mie$l U0v Q.Y0  顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

/VZ7G%W1S}4P0

"h`lr{F+A0  匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

i md[#b b WN051Testing软件测试网}t3Dc+o1I*FG"P/Y

  只用到类的一个实例。

fsX?wQX0

uC#CmL+KJ3a0  ● 类在定义后马上用到。

,|*^(YDH A.P$u8Y+l0

$^2JWrkaIYb3_0  ● 类非常小(SUN推荐是在4行代码以下)51Testing软件测试网6R I/w$vE

51Testing软件测试网@l? JJ w@TgD

  ● 给类命名并不会导致你的代码更容易被理解51Testing软件测试网%_5]!t_1]W6B$r

51Testing软件测试网*rp!r[p

  在使用匿名内部类时,要记住以下几个原则:

] ~%ICB'{/K0

6^#z Q)s%K%nY'h0O%e0  ● 匿名内部类不能有构造方法。51Testing软件测试网:c.\$FR'x"G"f[

x^#w U-?\/t0  ● 匿名内部类不能定义任何静态成员、方法和类。51Testing软件测试网*\}1}9Q~

51Testing软件测试网\uk4Lai

  ● 匿名内部类不能是public,protected,private,static。51Testing软件测试网lzx7Y n.C6b D Z8r#s

51Testing软件测试网 IJW2F[#\?

  ● 只能创建匿名内部类的一个实例。51Testing软件测试网 x l6j+g1^Ty

51Testing软件测试网]rZ8H-J

  ● 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

1}6PT/Cc0{'In N051Testing软件测试网G7{{y-e-s4M%G6}

  ● 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。51Testing软件测试网R*w'LAHl2`(I

51Testing软件测试网}giV[~

  A、继承式的匿名内部类和接口式的匿名内部类。51Testing软件测试网 tnt8q-FK \$b

51Testing软件测试网&@ ] t |HIlk

51Testing软件测试网:c A A$jh7Q)[tB'l

  1. import java.util.Arrays;  
  2. import java.util.Comparator;  
  3. /**匿名内部类 语法*/ 
  4. public class AnnInnerClass {  
  5.  public static void main(String[] args) {  
  6.   // TODO Auto-generated method stub 
  7.   Yoo yoo = new Yoo();//创建Yoo的实例 
  8.   Yoo y1 = new Yoo(){};  
  9.   //new Yoo(){}创建匿名类实例 
  10.   //匿名类new Yoo(){}是继承Yoo类,并且同时创建了对象 
  11.   //new Yoo(){}是Yoo的子类型,其中{}是类体(class Body) 
  12.   //类体中可以定义任何类内的语法,如:属性,方法,方法重载,方法覆盖,等 
  13.   //子类型没有名字,所以叫匿名类! 
  14.   Yoo y2 = new Yoo(){  
  15.    public String toString(){//方法重写(覆盖) 
  16.     return "y2"//y2是子类的实例 
  17.    }  
  18.   };  
  19.   System.out.println(y2);//"y2",调用了匿名类对象toString() 
  20.   //匿名内部类可以继承/实现 于 类,抽象类,接口等 
  21.   //按照继承的语法,子类型必须实现所有的抽象方法 
  22.     
  23.   //Xoo x = new Xoo(){};//编译错误,没有实现方法 
  24.   final int b = 5;  
  25.   Xoo xoo = new Xoo(){ //是实现接口,并且创建匿名类实例,不是创建接口对象 
  26.    public int add(int a){//实现接口中的抽象方法 
  27.     return a+b; //要访问局部变量b,只能访问final变量 
  28.    }  
  29.   };  
  30.   System.out.println(xoo.add(5));//10,调用对象的方法 
  31.   //Comparator接口也可以使用匿名类的方式 
  32.   Comparator<String> byLength = new Comparator<String>(){  
  33.    public int compare(String o1,String o2){  
  34.     return o1.length()-o2.length();  
  35.       
  36.    }  
  37.   };  
  38.   String[] names = {"Andy","Tom","Jerry"};  
  39.   Arrays.sort(names,byLength);  
  40.   System.out.println(Arrays.toString(names));  
  41.   //也可以这样写,工作中常用 
  42.   Arrays.sort(names,new Comparator<String>(){  
  43.    public int compare(String o1,String o2){  
  44.     return o1.length()-o2.length();  
  45.    }  
  46.   });  
  47.  }  
  48. }
接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。51Testing软件测试网'l v2q ] H[f|(c v

  B. 参数式的匿名内部类。51Testing软件测试网'w"}R,eF'?7lTK

W S4EXw0

(S1^8N*yRx(G |0
  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. }
51Testing软件测试网H%P*I/o&ac

51Testing软件测试网q ~1FI4j7_ab|'{

#Lqf!dF M0  构造内部类对象的方法有:

ii`)B3M s)s W:N0sI0

!NINK&r:Q0  1、内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:51Testing软件测试网 gRbV,x@:S8j

5Tmb5C;v2x*x0  (1)

N DS$v-]nky051Testing软件测试网+B&ZU)|FN

51Testing软件测试网\%hq!aU6g6ev

  1. OuterClass out = new OuterClass();  
  2. OuterClass.InnerClass in = out.new InnerClass();
51Testing软件测试网4aJ5o[7l+z7E

51Testing软件测试网+fDi!cW*C:D

51Testing软件测试网5u#cL~!VI

  (2)51Testing软件测试网 Q ~%~s wX

51Testing软件测试网TBC%dq-|+D

W.z!jt GrU q0
OuterClass.InnerClass in=new OuterClass().new InnerClass();

a.qz\~$xY;t-n051Testing软件测试网6z h(v\ C(F(X(DZf

51Testing软件测试网_5CTx3@k ]M.V){J#@o

  其中OuterClass是外部类,InnerClass是内部类。

~:JR.CT H5q051Testing软件测试网adS c4cc"TQ5gA

  2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:51Testing软件测试网-Te*Rl Y_,[-L

51Testing软件测试网K.XD#}+oR"W3i

!I On |;V+g$z/{0
InnerClass in = new InnerClass();
51Testing软件测试网 ~"^Z c Bf:L

51Testing软件测试网5A|!ARNK:W O

)a*V5B#pP9~L_;G0  3、如果内部类为静态类,则可用如下形式来构造函数:51Testing软件测试网 n-JLw+zG3`M

G*AD|8yE4h ^051Testing软件测试网4GykGe%k xQ

OuterClass.InnerClass in = new OuterClass.InnerClass();
51Testing软件测试网0d"fy O-M5BW

-F a!r'q|\u0

s1z](]2m6q*`0  无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。

q-dtj[2z3n(Y0

TAG:

 

评分:0

我来说两句

Open Toolbar