Android开发必知的java嵌套类

BraHealey 8年前
   <p>嵌套类指定义在另一个类的内部的类,嵌套类的存在只是为了他的外围类。嵌套类有四种:静态成员类,非静态成员类,匿名类,局部类。</p>    <ul>     <li> <p>静态成员类是最简单的一种嵌套类。最好把它看做是一个普通的类,只是恰好定义在另一个类的内部。静态成员类可以访问外围类的所有成员,包括那些私有的变量。静态成员类同样遵守可访问性规则,如果将它定位私有,它就指在外围类的内部才能访问到。</p>      <ol>       <li> <p>在Android中 最为熟悉listview的ViewHolder我们通常使用的就是静态成员类,通常作为一个公有的辅助类。作为Listview的缓存变量缓存view中布局。</p> </li>       <li> <p>私有静态成员类,用来代表外围类所代表的对象的组件。</p> <p>代码如下</p> </li>      </ol> <pre>  <code class="language-java">public class PhotoListAdapter extends RecyclerView.Adapter<PhotoListAdapter.ImageVH> {  static class ImageVH extends RecyclerView.ViewHolder {         //代码省略      }  }</code></pre> <p>​</p> </li>     <li> <p>非静态成员类与静态成员类的语法区别在于是否有修饰符static 。尽管它们的语法很像,但是两者的区别很大。非静态成员类的每个实例都隐含这与外部类的一个外围实例相关联,非静态成员类实例方法内部,可以调用外围实例上的方法,只有静态成员类的实例可以在外围类独立存在,没有外围实例的情况下,无法创建非静态成员类的实例。</p> <p>当非静态成员类的实例创建,它与外围实例之间的关联也随之被建立,而且这种关联关系以后不能被修改。 这个关联通常发生在外围类的某个实例方法调用了非静态成员类的构造器时。 这种关联关系需要消耗非静态成员类实例的空间,并增加了构造的时间开销。 <strong>如果成员类不需要访问外围类实例 请加上static修饰词</strong> 。</p> <pre>  <code class="language-java">public class PhotoListAdapter extends RecyclerView.Adapter<PhotoListAdapter.ImageVH> {   class ImageVH extends RecyclerView.ViewHolder {             // 真是对外部类的实例持有,在Android开发中很大部分activity中的context的内存泄露因为这个原因。      }  }</code></pre> <p>​</p> </li>     <li> <p>匿名类不同与JAVA的其他语法单元,匿名类没有名字,它不是外围类的一个成员,它不与其他的成员一起被申明,而是在使用的同时被声明实例化。匿名类可以出现在代码任何存在表达式的地方。只有匿名类出现在非静态的环境中,他才有外围实例,即使它声明在静态的环境中,也不可能拥有任何静态成员。</p> <pre>  <code class="language-java">imageView.setOnClickListener(new View.OnClickListener() {                  @Override                  public void onClick(View v) {                     // 代码省略                  }              });</code></pre> <p>​</p> </li>     <li> <p>局部类在任何"可以声明局部变量"的地方声明。同样遵守作用域规则,1. 局部类拥有名字,可以被重复使用。2. 与匿名类,只有当局部类是在非静态环境定义的时候,才有外围实例,不能包含静态成员。</p> <pre>  <code class="language-java">public class mainActivity extends Activity{   private Handler handler = new Handler(){          @Override          public void handleMessage(Message msg) {             // 此处同样可能引起context持有导致的内存泄露          }      };    }</code></pre> <p>​</p> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/907758c2a63f</p>    <p> </p>