一、什么是内部类?or 内部类的概念
内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。
public class TestA{
class TestB {}
}
二、 为什么需要内部类?or 内部类有什么作用?
1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
2、内部类可以对同一个包中的其他类隐藏起来。
3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
三、 内部类的分类
成员内部类,局部内部类,匿名内部类,静态内部类
3.1 成员内部类
成员内部类:存在于某个类的内部,与全局属性或者方法同级的内部类就是成员内部类。
举一个成员内部类实例:
public class Person{
public void run(){}
public class DoWork implements Work{}
}
成员内部类特点:
1、(重要)成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括静态成员和私有成员)。!!很重要
2、成员内部类和外部类的属性和方法名同名时,外部类的属性和方法会隐藏;但可以通过外部类.this.成员变量的方式访问外部类的属性和方法。
3、 外部类必须通过成员内部类的对象来访问内部类的属性和方法。
4、 成员内部类对象会隐式的引用一个外部类对象。(可以解释第一点)
5、 成员内部类可以有public\private\protected以及默认访问权限。
3.2 局部内部类
举一个局部内部类实例:
public class Person{
public void run(){
class DoWork implements Work{}
}
}
注意:和成员内部类的区别,局部内部类在方法里面
局部内部类:是定义在一个方法或者一个作用域里面的类。它与成员内部类的区别在于局部内部类的访问仅在于方法内或者作用域内。
局部内部类的特点:
1、 不能有private、public、protected和static等修饰符,与局部变量类似。
2、只能在定义局部内部类的方法或者作用域中实例化;
3、 局部内部类的对象不能使用该内部类所在方法或者作用域的非final局部变量(为什么?);
3.3 匿名内部类
举一个匿名内部类实例:
public class Person{
public DoWork doSomething(){
return new DoWork(){
public void do(){}
};
}
}
什么是匿名内部类:不定义类的名字,在使用的地方直接定义对象。
匿名内部类的特点:
1、唯一一种没有构造器的类;匿名内部类在编译时,编译器会自动起名xxx$1.class;
2、 匿名内部类不能存在任何静态的变量、方法等;
3、 匿名内部类是局部内部类的特例;
4、大部分匿名内部类用于接口返回;
3.4 静态内部类
举一个静态内部类实例:
public class Person{
public void run(){}
public static class DoWork implements Work{}
}
注意和成员内部类的区别
静态内部类:在成员内部类的基础上加上一个static关键字就是静态内部类。
静态内部类的特点:
1、不需要依赖外部类。
2、不能使用外部类的非静态属性和方法。
例题:
下列说法正确的是(AB)?
A、对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们
B、 成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)
C、由于匿名内部类只能用在方法内部,所以匿名内部类的用法与局部内部类是一致的
D、静态内部类可以直接访问外部类的非静态成员