Java核心类库:内部类那点事儿-2
上一篇 /
下一篇 2012-04-18 14:36:40
/ 个人分类:Java
4)匿名内部类mie$l U0vQ.Y0 顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
/VZ7G%W1S}4P0"h`lr{F+A0 匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
i md[#bbWN051Testing软件测试网}t3Dc+o1I*FG"P/Y 只用到类的一个实例。
fsX?wQX0uC#CmL+KJ3a0 ● 类在定义后马上用到。
,|*^(YDHA.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'{/K06^#z
Q)s%K%nY'h0O%e0 ● 匿名内部类不能有构造方法。51Testing软件测试网:c.\$F R'x"G"f[
x^#w
U-?\/t0 ● 匿名内部类不能定义任何静态成员、方法和类。51Testing软件测试网*\}1}9Q~
51Testing软件测试网\uk4Lai ● 匿名内部类不能是public,protected,private,static。51Testing软件测试网lzx7Y
n.C6bD
Z8r#s
51Testing软件测试网 IJW2F[#\ ? ● 只能创建匿名内部类的一个实例。51Testing软件测试网 xl6j+g1^Ty
51Testing软件测试网]r Z8H-J ● 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
1}6PT/Cc0{'InN051Testing软件测试网G7{{y-e-s4M%G6} ● 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。51Testing软件测试网R*w'L AHl2`(I
51Testing软件测试网}giV[~ A、继承式的匿名内部类和接口式的匿名内部类。51Testing软件测试网
tnt8q-FK
\$b
51Testing软件测试网&@]t|HIlk51Testing软件测试网:c
AA$jh7Q)[tB'l
- import java.util.Arrays;
- import java.util.Comparator;
-
- public class AnnInnerClass {
- public static void main(String[] args) {
-
- Yoo yoo = new Yoo();
- Yoo y1 = new Yoo(){};
-
-
-
-
-
- Yoo y2 = new Yoo(){
- public String toString(){
- return "y2";
- }
- };
- System.out.println(y2);
-
-
-
-
- final int b = 5;
- Xoo xoo = new Xoo(){
- public int add(int a){
- return a+b;
- }
- };
- System.out.println(xoo.add(5));
-
- Comparator<String> byLength = new Comparator<String>(){
- public int compare(String o1,String o2){
- return o1.length()-o2.length();
-
- }
- };
- String[] names = {"Andy","Tom","Jerry"};
- Arrays.sort(names,byLength);
- System.out.println(Arrays.toString(names));
-
- Arrays.sort(names,new Comparator<String>(){
- public int compare(String o1,String o2){
- return o1.length()-o2.length();
- }
- });
- }
- }
|
接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
51Testing软件测试网'l
v2q
]
H[f|(cv B. 参数式的匿名内部类。51Testing软件测试网'w"}R,eF'?7lTK
W S4EXw0
(S1^8N*yRx(G |0- class Bar{
- void doStuff(Foo f){
- }
- }
- interface Foo{
- void foo();
- }
- class Test{
- static void go(){
- Bar b = new Bar();
- b.doStuff(new Foo(){
- public void foo(){
- System.out.println("foofy");
- }
- });
- }
- }
|
51Testing软件测试网H%P*I/o&ac51Testing软件测试网q~1FI4j7_ab|'{
#Lqf!dF M0 构造内部类对象的方法有:
ii`)B3M s)sW:N0sI0!NINK&r:Q0 1、内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:51Testing软件测试网
gRbV,x@:S8j
5Tmb5C;v2x*x0 (1)
N
DS$v-]nky051Testing软件测试网+B&ZU)|FN51Testing软件测试网\%hq!aU6g6ev
- OuterClass out = new OuterClass();
- OuterClass.InnerClass in = out.new InnerClass();
|
51Testing软件测试网4aJ5o[7l+z7E51Testing软件测试网+fDi!cW*C:D
51Testing软件测试网5u#cL~!V I (2)51Testing软件测试网
Q ~%~s wX
51Testing软件测试网TBC%dq-|+DW.z!jt GrU
q0OuterClass.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软件测试网adSc4cc"TQ5gA 2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:51Testing软件测试网-Te*RlY_,[-L
51Testing软件测试网K.X D#}+oR"W3i!I On
|;V+g$z/{0InnerClass in = new InnerClass(); |
51Testing软件测试网 ~"^Z c
Bf:L51Testing软件测试网5A|!A RNK: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"fyO-M5BW-F a!r'q |\u0s1z](]2m6q*`0 无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。
q-dtj[2z3n(Y0
收藏
举报
TAG: