java匿名内部类返回值_java匿名内部类

java的内部类可以玩出好多花样。介绍都挺多,我就不废话了。专门记一下困惑了我好半天的匿名内部类。

总结一下:

1.匿名内部类通常是为了省事(直接获取一个类实例,这个类实例只在此处用一次,就省得再给它起个名字重新定义了)。所以原则是尽量简单。如果用了这个方法,给读代码的人带来很大困惑,那就得不偿失了

2.匿名内部类不能有构造方法

3.匿名内部类不能定义静态变量、方法和类

4.匿名内部类通常为了实现某个接口或抽象类(实现接口只能实现一个)

5.匿名内部类还可以有继承式用法(和外部类同名,表示继承这个外部类,可以覆写方法,但新增方法通常意义不大)

示例代码:(我觉得已经够乱的了,当然你还可以写的更乱)public class Out1 {

private String x;

public int a=3;

public Out1(String x){

this.x=x;

System.out.println(this.a);

}

@Override

public String toString(){

return "x="+x;

}

public void pp(){

System.out.println("pp");

}

class InnerFn{

public Out2 rOut2(){

return new Out2(11){

public String outkkk(){

return "kkk";

}

public void prf(){

System.out.println(outkkk());

}

};

//此处{}段,定义了一个内部类。匿名内部类可以实现一个接口或继承一个类(不能有构造函数),

//自己加的方法只能用于内部类局部

}

public Out1 rOut1(){

return new Out1("mmm"){

public int bb=5;

public void ff(){

System.out.println("ff");

}

//无法定义构造方法,只能加返回值变成普通方法

public void Out1(int a){

bb=a;

}

@Override

public void pp(){

ff();

//Out1(8);

System.out.println("匿名内部类覆盖外部类方法");

System.out.println(bb);

}

};

//继承式匿名内部类

}

}

public static void main(String[] args){

Out1 ou1=new Out1("abc");

ou1.pp();

InnerFn t2=ou1.new InnerFn();

System.out.println(ou1);

System.out.println(t2.rOut2());

System.out.println(t2.rOut1());

t2.rOut2().prf();

t2.rOut1().pp();

//t2.rOut1().ff(); //编译通不过,匿名内部类的方法不能被外部识别

}

}

public abstract class Out2 {

private int a;

Out2(int a ) {

this.a=a;

}

abstract void prf();

}

-------------------------------------------------------------------------------------

又看了几篇文章及其评论,觉得有些概念还是深究一下:

1.所匿的是类的名字而非实例的名字——也就是说,原本这里应该写出 Classxx extends Out1或 Classxx implements Iout1 的,然后再 new Classxx()

2.既然这个Classxx没写,那么我们new的时候就用了其超类的类型,也就是写出了new  Out1(){}

3.此时定义了类的同时也产生了实例。这个实例可以赋给一个Out1类型的变量。当然我上面的例子是直接return 了一个对象,而且在外面我也没有给它分配名字,就直接调用其方法了:t2.rOut1().pp();

4.我们甚至可以定义完就直接调用某个方法来完成某个任务,而在外面根本就没有任何使用它的痕迹:比如在某个方法中 new Out1(){ public ... }.xx 。同前所述,这个xx必须是超类中定义了的方法。其实这种用法才是匿名内部类的意义。单次使用,用完就“扔”了。

5.有的文章里说可以实现多个接口,我觉得不对。因为匿名类采用的是隐含的继承(与超类同名),那么名称只有一个,也就是只能实现一个接口。——当然,如果其超类实现了多个接口,这个就不算在这了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值