关闭

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

发表于:2012-4-18 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:只是小人物    来源:51Testing软件测试网采编

  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<String> byLength = new Comparator<String>(){  
  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<String>(){  
  45.    public int compare(String o1,String o2){  
  46.     return o1.length()-o2.length();  
  47.    }  
  48.   });  
  49.  }  
  50.  
  51. }

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号