内部类的主要作用:
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
一、 局部内部类
局部内部类是定义在外围类的方法中的,在访问的时候它可以直接访问外围类的所有成员,但是不能随便访问局部变量,除非这个局部变量被final修饰。
//局部内部类
public class LocalInnerClass {
int a = 10;
public static void main(String[] args) {
int c = 0;
class Noo{
public int add(int a, int b) {
//局部内部类访问的外部类变量必须是final
//return a + b + c; 编译错误
return a + b;
}
}
Noo noo = new Noo();
noo.add(1, 1);
}
}
二、成员内部类
成员内部类是最普通的内部类,它可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
//成员内部类
public class InnerClass {
public static void main(String[] args) {
Aoo aoo = new Aoo("蔡徐坤");
Boo boo1 = aoo.new Boo();
boo1.f();
}
}
class Aoo{
String name;
public Aoo(String name) {
this.name = name;
}
/**
* 成员内部类,类似实例变量,依赖外部类
* 需要先创建外部类对象Aoo,才能创建Boo对象
*
*/
class Boo{
public void f() {
System.out.println(name);
}
}
}
三、静态内部类
静态内部类是用static修饰的,在访问限制上它只能访问外部类中的static所修饰的成员变量或者是方法。
//静态内部类
public class StaticInnerClass {
public static void main(String[] args) {
//类名直接访问
Foo.Goo goo = new Foo.Goo();
goo.f();
System.out.println(goo.age);
}
}
class Foo{
static String name;
int age;
/**
* 静态内部类-相当于静态变量
* 1.类加载时初始化
* 2.访问的外部变量必须是static
*/
static class Goo{
int age = 18;
public void f() {
//System.out.pritnln(age); 编译错误-->2.
System.out.println(name);
}
}
}
四、匿名内部类
匿名内部类其实就是局部内部类的简写格式,只能使用一次。
- 使用匿名内部类时,必须继承一个类或者实现一个接口,但是两者不可兼得。
- 匿名内部类中是不能定义构造函数的。
- 匿名内部类中不能存在任何的静态成员变量和静态方法。
- 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
//匿名内部类
public class AnnoInnerClass {
public static void main(String[] args) {
/**
* 匿名内部类:相当于当前类或接口的子类
*/
new Xoo(){ //创建的是Xoo的子类对象
@Override
public int add(int a, int b) {
return a + b;
}
};
}
interface Xoo{
public int add(int a, int b);
}
}