android button 匿名内部类的理解

来源:互联网 发布:农村淘宝佣金高 编辑:程序博客网 时间:2024/05/17 01:16

Button OnclickListener 的使用

1 匿名内部类的使用

 有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。例如:

  1. ((Button) findViewById(R.id.start)).setOnClickListener(new Button.OnClickListener() { 
  2.     @Override 
  3.     public void onClick(View v) { 
  4.         new Thread() { 
  5.  
  6.             @Override 
  7.             public void run() { 
  8.                 // TODO Auto-generated method stub 
  9.             } 
  10.  
  11.         }.start(); 
  12.     } 
  13. }); 
  14.   匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的,看下面例子:
    1. public class Outer { 
    2.     public static void main(String[] args) { 
    3.         Outer outer = new Outer(); 
    4.         Inner inner = outer.getInner("Inner""gz"); 
    5.         System.out.println(inner.getName()); 
    6.     } 
    7.  
    8.     public Inner getInner(final String name, String city) { 
    9.         return new Inner() { 
    10.             private String nameStr = name; 
    11.  
    12.             public String getName() { 
    13.                 return nameStr; 
    14.             } 
    15.         }; 
    16.     } 
    17.  
    18. //注释后,编译时提示类Inner找不到 
    19. /* interface Inner { 
    20.     String getName(); 
    21. } */ 
    同时在这个例子,留意外部类的方法的形参,当所在的方法的形参需要被内部类里面使用时,该形参必须为final
    因为匿名内部类,没名字,是用默认的构造函数的,无参数的,那如果需要参数呢?则需要该类有带参数的构造函数:
    1. public class Outer { 
    2.     public static void main(String[] args) { 
    3.         Outer outer = new Outer(); 
    4.         Inner inner = outer.getInner("Inner""gz"); 
    5.         System.out.println(inner.getName()); 
    6.     } 
    7.  
    8.     public Inner getInner(final String name, String city) { 
    9.         return new Inner(name, city) { 
    10.             private String nameStr = name; 
    11.  
    12.             public String getName() { 
    13.                 return nameStr; 
    14.             } 
    15.         }; 
    16.     } 
    17.  
    18. abstract class Inner { 
    19.     Inner(String name, String city) { 
    20.         System.out.println(city); 
    21.     } 
    22.  
    23.     abstract String getName(); 
    注意这里的形参city,由于它没有被匿名内部类直接使用,而是被抽象类Inner的构造函数所使用,所以不必定义为final。


0 0
原创粉丝点击