2.局部内部类
  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问于方法内或者该作用域内。
  定义在方法里的内部类:
  class Outter {
  private int age = 12;
  public void Print(final int x) {    //这里局部变量x必须设置为final类型!
  class Inner {
  public void inPrint() {
  System.out.println(x);
  System.out.println(age);
  }
  }
  new Inner().inPrint();
  }
  }
  public class test1 {
  public static void main(String[] args) {
  Outter out = new Outter();
  out.Print(10);
  }
  }
  运行结果:
  10
  12
  本例中我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义。
  换句话说,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于局部变量被设置为final,所以不能再内部类中改变局部变量的值。(这里看到网上有不同的解释,还没有彻底搞清楚==)
  定义在作用域内的内部类:
  class Outter {
  private int age = 12;
  public void Print(final boolean x) {  //这里局部变量x必须设置为final类型!
  if(x){
  class Inner {
  public void inPrint() {
  System.out.println(age);
  }
  }
  new Inner().inPrint();
  }
  }
  }
  public class test1 {
  public static void main(String[] args) {
  Outter out = new Outter();
  out.Print(true);
  }
  }
  运行结果:12
  3.静态嵌套类
  又叫静态局部类、嵌套内部类,是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。
  class Outter {
  private static int age = 12;
  static class Inner {
  public void print() {
  System.out.println(age);
  }
  }
  }
  public class test1 {
  public static void main(String[] args) {
  Outter.Inner in = new Outter.Inner();
  in.print();
  }
  }
  运行结果:
  12
  可以看到,如果用static 将内部内静态化,那么内部类只能访问外部类的静态成员变量,具有局限性。
  其次,因为内部类被静态化,因此Outter.Inner可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)
  4.匿名内部类
  匿名内部类应该是平时我们编写代码时用得多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段Android事件监听代码:
  scan_bt.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  }
  });
  history_bt.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  }
  });
  这段代码为两个按钮设置监听器,这里面使用了匿名内部类。具体位置是这段:
  new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  }
  }
  代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。当然像下面这种写法也是可以的,跟上面使用匿名内部类达到效果相同:
  private void setListener()
  {
  scan_bt.setOnClickListener(new Listener1());
  history_bt.setOnClickListener(new Listener2());
  }
  class Listener1 implements View.OnClickListener{
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  }
  }
  class Listener2 implements View.OnClickListener{
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  }
  }
  这种写法虽然能达到一样的效果,但是既冗长又难以维护,所以一般使用匿名内部类的方法来编写事件监听代码。同样的,匿名内部类也是不能有访问修饰符和static修饰符的。
  匿名内部类是一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。