什么是内部类?
内部类是定义在另一个类中的类;即内部类对象引用了实例化该内部对象的外围类对象。
为什么需要内部类?
内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
内部类可以对同一个包中的其他类隐藏起来。
当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
内部类的分类
一、成员内部类
成员内部类:
存在于某个类的内部的非静态类,与全局属性或者方法同级的内部类就是成员内部类。
成员内部类特点:
①成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括静态成员和私有成员)。
②成员内部类和外部类的属性和方法名同名时,外部类的属性和方法会隐藏;但可以通过外部类.this.成员变量的方式访问外部类的属性和方法。
③外部类必须通过成员内部类的对象来访问内部类的属性和方法。
④成员内部类对象会隐式的引用一个外部类对象。(可以解释第一点)
⑤成员内部类可以有public\private\protected以及默认访问权限。
二、静态内部类
静态内部类:
在成员内部类的基础上加上一个static关键字就是静态内部类。
静态内部类的特点:
不需要依赖外部类。
不能使用外部类的非静态属性和方法。
项目中的使用:
Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象类,HashMap内部维护Entry数组用来存放元素,但是Entry对使用者是透明的。像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。
三、局部内部类
局部内部类:
是定义在一个方法或者一个作用域里面的类,就是局部类。它与成员内部类的区别在于局部内部类的访问仅在于方法内或者作用域内。
(局部内部类是嵌套在方法和作用域内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,然而又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。)
局部内部类的特点:
不能有private、public、protected和static等修饰符,与局部变量类似。
只能在定义局部内部类的方法或者作用域中实例化;
局部内部类的对象不能使用该内部类所在方法或者作用域的非final局部变量(为什么?);
项目中的使用:
如果一个类只在某个方法中使用,则可以考虑使用局部类。
四、匿名内部类
匿名内部类:
不定义类的名字,在使用的地方直接定义对象。
匿名内部类的特点:
唯一一种没有构造器的类;匿名内部类在编译时,编译器会自动起名xxx$1.class;
匿名内部类不能存在任何静态的变量、方法等;
匿名内部类是局部内部类的特例;
大部分匿名内部类用于接口返回;
匿名内部类是没有访问修饰符的。
new 匿名内部类,这个类首先是要存在的。
当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
匿名内部类没有明面上的构造方法,编译器会自动生成一个引用外部类的构造方法。
项目中的使用:
匿名内部类使用广泛,比如我们常用的绑定监听的时候。
使用匿名内部类,创建线程
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"click",Toast.LENGTH_SHORT).show(); }
});