您的位置:首页 > 移动开发 > Android开发

Android里面的匿名类与匿名内部类使用

2012-12-05 09:52 134 查看
在android开发中经常碰到匿名类(和匿名内部类)的使用,那么匿名类和一般情况下使用的类有什么不同,从实现的功能来讲是一样的,但是使用匿名更加简洁方便,形式上有点像new一个接口或类的感觉,但是我们必须记住接口是不可以new出来的(实例化),我们要在内部重写需要的接口的方法,这样就new出了一个实现接口方法的对象,但是这个对象的类名不可见,所以叫做匿名类。下面是功能相同的两段代码,分别用上述两种写法实现:
匿名类
形式如下:new <类或接口> <类的主体>
button.setOnClickListener(listener );
 
 private View.OnClickListener listener = new View.OnClickListener()
     {
         @Override
         public void onClick(View v)
         {
             String phonenum = phoneEditText.getText().toString();
             Intent intent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + phonenum));
             startActivity(intent);
         }
     };// 在这里需要一个分号

自定义继承接口的类:
button.setOnClickListener(new ButtonListener());
private final class ButtonListener implements View.OnClickListener{
    public void onClick(View v)    {
            EditText mobileText = (EditText)findViewById(R.id.mobile);
            String mobile = mobileText.getText().toString();
            Intent intent = new Intent();
            intent.setAction("android.intent.action.CALL");
            intent.setData(Uri.parse("tel:"+ mobile));
            startActivity(intent);
    }
}

匿名类不等同于匿名内部类
匿名类不等同于匿名内部类,后者也经常使用,匿名内部类是内部类的一种,使用的时候更加简洁,但是不是任何情况下都需要使用。
在thinking in java 3th 是这么阐述的:

简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较
合适的:

  ·只用到类的一个实例。

  ·类在定义后马上用到。

  ·类非常小(SUN推荐是在4行代码以下)

  ·给类命名并不会导致你的代码更容易被理解。

  在使用匿名内部类时,要记住以下几个原则:
  ·匿名内部类不能有构造方法。

  ·匿名内部类不能定义任何静态成员、方法和类。

  ·匿名内部类不能是public,protected,private,static。

  ·只能创建匿名内部类的一个实例。

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

  ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
//在方法中返回一个匿名内部类
public class Parcel6 
{
     public Contents cont() 
     {
        return new Contents() 
                       {
                        private int i = 11;
                        public int value() 
                         {
                            return i;
                          }
     }; // 在这里需要一个分号
} 
public static void main(String[] args) 
{
       Parcel6 p = new Parcel6();
       Contents c = p.cont();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: