内部类:就是在类里面再定义一个类。相当于类中的一个成员。编译之后,内部类也可产生单独的.class文件,文件名为:外部类名$内部类名.class
内部类提供了更好的封装,把内部类隐藏在外部类中不允许同一个包中的其他类访问该类;
内部类成员可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节:内部类的属性;
使用内部类在编写事件处理驱动的程序时用起来很方便。
只有内部类才能够是私有的--安全机制,只有其外部类的方法才能够创建内部类对象。
没有名称的内部类叫匿名内部类:当创建一个对象会会立即消失,所以只能调用一次;
如果满足下面的一些条件,使用匿名内部类是比较合适的:·只用到类的一个实例·类在定义后马上用到
·
类非常小(推荐在4行代码以下)
·给类命名并不会导致你的代码更容易被理解
例:class 类名 implements ActionListener
{ public void actionPerformed(ActionEvent e){…}
}
new 类名();
等同于
new ActionListener()
{ public void actionPerformed(ActionEvent e){…}};
·由于匿名内部类没有名称,因此创建匿名内部类对象时,new运算符后是超类或接口的名称,其后的{}内部为匿名类的定义(匿名类对象的创建和匿名类的声明是在一起的)。
·匿名类不能是抽象类,因为系统在创建匿名类的时候,会立即创建匿名类的对象。因此不允许将匿名类定义成抽象类。
·匿名类不能有构造方法,因为匿名类没有类名,无法定义构造方法,但匿名类可以定义实例初始化块,通过实例初始化块来完成构造方法需要完成的事情。
·匿名类不能定义任何静态成员、方法和类;
匿名类不能是public、protected、private、static;
·只能创建匿名类的一个实例。
有static修饰的叫静态内部类;也可以用其他的修饰符;
静态内部类没有父类,不能引用外部类实例成员或其他内部类成员。
注意:
·静态内部类可访问外部类的任意静态字段或静态方法。
·像静态方法或静态字段一样,静态内部有权限修饰符。
·静态内部类不能与外部类重名。
·向外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法。
·静态内部类只能定义域外部类的顶层代码或外部类其他静态成员类的顶层代码中;不能定义于外部类的某个函数中
和普通的外部类不同,内部类的其所在的外部类的一个成员,内部类对象不能单独存在,它必须依赖一个外部类对象;