一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。
内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。
/**外部类Outer*/
class Outer {
private int age = 10;
public void show(){
System.out.println(age);//10
}
/**内部类Inner*/
public class Inner {
//内部类中可以声明与外部类同名的属性与方法
private int age = 20;
public void show(){
System.out.println(age);//20
}
}
}
注意
内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同。
内部类的作用:
1. 内部类提供了更好的封装。只能让外部类直接访问,
不允许同一个包中的其他类直接访问。
3. 内部类可以直接访问外部类的私有属性,内部类被当成其外
部类的成员。但外部类不能访问内部类的内部属性。
4. 接口只是解决了多重继承的部分问题,而内部类使得多重
继承的解决方案变得更加完整。
内部类的使用场合:
1. 由于内部类提供了更好的封装特性,并且可以很方便的访问
外部类的属性。所以,在只为外部类提供服务的情况下可以
优先考虑使用内部类。
2. 使用内部类间接实现多继承:每个内部类都能独立地继承
一个类或者实现某些接口,所以无论外部类是否已经继承了某个
类或者实现了某些接口,对于内部类没有任何影响。