java内部类

经常被java的各种内部类搞混,这里简单罗列一下:

在Java中,将一个类定义在另一个类或一个方法里面,这样的类称为内部类。其中包括成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类:定义于另一个类内部的类,如:

 1 class Outter {
 2     private int mA;
 3     
 4     public Outter() { }
 5     
 6     class Innter () { // 内部类
 7         public int mB = -1;
 8         public void print() {
 9             System.out.print(mA); // 访问外部内的成员
10         }
11     }
12 }
  • 成员内部类可以访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
  • 当成员内部类拥有和外部类同名的成员变量或者方法时,默认情况下访问的是内部类的成员。如果要访问外部类的同名成员,用:Outter.this.print()/mB
  • 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问,如:new Innter().print()
  • 成员内部类是依附外部类而存在的,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。

局部内部类:定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

  • 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

匿名内部类:没有显示类名的内部类,如:

1 scan_bt.setOnClickListener(new OnClickListener() {             
2     @Override
3     public void onClick(View v) {
4         // TODO Auto-generated method stub
5      }
6 });
  • 使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。
  • 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

静态内部类:定义在另一个类里面的static类。

  • 静态内部类不需要依赖于外部类,它不能使用外部类的非static成员变量或者方法。

注意理解:内部类的存在使得Java的多继承机制变得更加完善,每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整

文章摘自:https://www.cnblogs.com/dolphin0520/p/3811445.html

原文地址:https://www.cnblogs.com/caidi/p/10413000.html