内部类是什么?
由文章开头可知,内部类的定义为:定义在另一个类或方法中的类。而根据使用场景的不同,内部类还可以分为四种:成员内部类,局部内部类,匿名内部类和静态内部类。每一种的特性和注意事项都不同,下面我们一一说明。
成员内部类
顾名思义,成员内部类是定义在类内部,作为类的成员的类。如下:
public class Outer { public class Inner{ } }
特点如下:
- 成员内部类可以被权限修饰符(eg.
public,private等
)所修饰 - 成员内部类可以访问外部类的所有成员,(包括
private
)成员 - 成员内部类是默认包含了一个指向外部类对象的引用
- 如同使用
this
一样,当成员名或方法名发生覆盖时,可以使用外部类的名字加.this指定访问外部类成员。如:Outer.this.name
- 成员内部类不可以定义
static
成员 - 成员内部类创建语法:
Outer outer=new Outer(); Outer.Inner inner=outer.new Inner();
局部内部类
局部内部类是定义在方法或者作用域中类,它和成员内部类的区别仅在于访问权限的不同。
public class Outer{ public void test(){ class Inner{ } } }
特点如下:
- 局部内部类不能有访问权限修饰符
- 局部内部类不能被定义为
static
- 局部内部类不能定义
static
成员 - 局部内部类默认包含了外部类对象的引用
- 局部内部类也可以使用
Outer.this
语法制定访问外部类成员 -
局部内部类想要使用方法或域中的变量,该变量必须是
final
的在JDK1.8 以后,没有
final
修饰,effectively final
的即可。什么意思呢?就是没有final
修饰,但是如果加上final
编译器也不会报错即可。
匿名内部类
匿名内部类是与继承合并在一起的没有名字的内部类
public class Outer{ public List<String> list=new ArrayList<String>(){ { add("test"); } }; }
这是我们平时最常用的语法。
匿名内部类的特点如下:
- 匿名内部类使用单独的块表示初始化块
{}
- 匿名内部类想要使用方法或域中的变量,该变量必须是
final
修饰的,JDK1.8之后effectively final
也可以 - 匿名内部类默认包含了外部类对象的引用
- 匿名内部类表示继承所依赖的类
静态内部类
静态内部类是用static
修饰的成员内部类
public class Outer { public static class Inner{ } }
特点如下:
- 静态内部类是四种类中唯一一个不包含对外部类对象的引用的内部类
- 静态内部类可以定义
static
成员 -
嵌套类能访问外部类任何静态数据成员与方法。