内部类是定义在另一个类中的类,之所以定义内部类,主要原因有以下三点:
1. 访问自身数据域
内部类可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。之所以内部类能访问到创建它的类的域,很大程度上是依赖了内部类对象的“隐式引用”,它指向了创建它的外部类对象。如
public class OutClass {
private String str = "OutClass 类变量";
public class InClass{
public void incre(){
System.out.println(str);
}
}
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.new InClass().incre();
}
}
输出结果:
OutClass 类变量
很明显,对于InClass类而言,是不存在str引用变量的,而从最终的打印结果来看,被打印出来的str引用变量来自于OutClass的域,这也就说明了InClass对象能够找到并访问OutClass的变量。如下:
2. 体现封装性
内部类可以对同一个包中的其它类隐藏起来。内部类本身的访问都是要通过外部构建他的类来间接访问,在同包下的类更不可能直接访问内部类了。外部的类访问内部类有两种方式,第一种是如上所述的
OutClass outClass = new OutClass();
outClass.new InClass().incre();
第二种就是将内部类直接定义为静态内部类,如下所示:
public class OutClass {
private static String str = "OutClass 类变量";
public static class InClass{
public static void incre(){
System.out.println(str);
}
}
public static void main(String[] args) {
OutClass.InClass.incre();
}
}
一旦将内部类设置为静态类,则意味着对外部类而言,静态内部类也是属于外部类的静态域,所以内部类也只能访问外部的静态变量。
3. 代码简洁
当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。很多时候我们只需要创建这个类的一个对象就能实现功能,匿名内部类就是在局部内部类的基础上再次简化了内部类的写法。如下所示:
public class OutClass {
private static String str = "OutClass 类变量";
public static void main(String[] args) {
new OutClass(){
public void print(){
System.out.println(str);
}
}.print();
}
}