zoukankan      html  css  js  c++  java
  • Android里面的匿名类与匿名内部类使用

          在android开发中经常碰到匿名类(和匿名内部类)的使用,那么匿名类和一般情况下使用的类有什么不同,

    从实现的功能来讲是一样的,但是使用匿名更加简洁方便,形式上有点像new一个接口或类的感觉,但是我们必须

    记住接口是不可以new出来的(实例化),我们要在内部重写需要的接口的方法,这样就new出了一个实现接口

    方法的对象,但是这个对象的类名不可见,所以叫做匿名类。下面是功能相同的两段代码,分别用上述两种写法

    实现:

    匿名类

    形式如下:new <类或接口> <类的主体>

     1 button.setOnClickListener(listener );
    2
    3 private View.OnClickListener listener = new View.OnClickListener()
    4 {
    5 @Override
    6 public void onClick(View v)
    7 {
    8 String phonenum = phoneEditText.getText().toString();
    9 Intent intent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + phonenum));
    10 startActivity(intent);
    11 }
    12 };// 在这里需要一个分号


    自定义继承接口的类:

    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();
    }

  • 相关阅读:
    407 Trapping Rain Water II 接雨水 II
    406 Queue Reconstruction by Height 根据身高重建队列
    405 Convert a Number to Hexadecimal 数字转换为十六进制数
    404 Sum of Left Leaves 左叶子之和
    403 Frog Jump 青蛙过河
    402 Remove K Digits 移掉K位数字
    401 Binary Watch 二进制手表
    400 Nth Digit 第N个数字
    398 Random Pick Index 随机数索引
    397 Integer Replacement 整数替换
  • 原文地址:https://www.cnblogs.com/avenwu/p/2325410.html
Copyright © 2011-2022 走看看