内部类
一、内部类种类:
成员内部类、局部内部类、匿名内部类,静态内部类;
1.1成员内部类
类中定义的类,成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);
当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,外部类的同名成员,需要以下面的形式进行访问:
外部类.this.内部类
外部类.this.成员方法
内部类对象可以拥有private访问权限、protected访问权限、public访问权限
private修饰:只能外部类访问;
protected修饰:只能在同一个包下或者继承外部类的情况下访问;
public修饰:任何地方都能访问;
默认:则只能在同一个包下访问;
1.2局部内部类
定义在一个方法或者一个作用域里面的类
内部类编译的时候,
1.3匿名内部类
如事件监听
new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
1.4静态内部类
能使用外部类的非static成员变量或者方法
二、内部类引用外部类
编译器会默认为成员内部类添加了一个指向外部类对象的引用;
局部内部类和匿名内部类只能访问局部final变量:
1、因为生命周期不一样,本地变量,在方法结束前就结束,而对象是可能一直存在的,因此当一个对象访问一个已经销毁的变量会出现问题;如果基本数据变量,为了保证copy的完整性,final保证了复制值不变的特性;如果是引用对象,则指向同一个对象,不允许指向另外一个对象,因此,匿名类和局部内部类访问外部局部变量,需要变量进行final修饰。
final修饰后,对于匿名内部类对象要访问的所有final类型局部变量,都拷贝成为该对象中的一个数据成员,且与原局部变量的值始终一致。