内部类
简单说明
内部类只能被相应的外部类使用,不允许同一个包中的其他类直接访问。
内部类可以访问外部类的成员,因为内部类被当作外部类的成员,类成员之间可以相互访问,但是外部内不能直接访问内部类的成员,包括Field和Method。
非静态内部类
每个内部类对象都引用一个外部类的this变量,假如内部类的某个方法中想访问外部类的一个Field,同时它自己的成员Field中也有一个同样的Field,那么:
通过this.变量名来访问自己的成员Field;
通过外部类名.this.变量名来访问外部类的Field。
静态内部类
用static修饰的内部类,该内部类属于外部类本身,而不属于外部类的某个对象,根据静态成员不能访问非静态成员的规则,静态内部类只能访问外部类的类成员,不能访问外部类的实例成员。因此可以通过外部类名.变量名访问外部类的类成员。
在外部使用内部类
用private修饰的内部类在外部类的内部使用;
用protected修饰的内部类可以在外部类内部被子类继承,在外部类外部跟private修饰的一样。
不加修饰符的内部类只能在外部类所在的包内部使用;
用public修饰的内部类能在任何地方使用,当然也要依赖外部类的访问权限。
实例化非静态内部类的形式:OuterClass.InterClass varName = new OuterClass().new InterClass();
或者: OuterClass outClassObject = new OutClass();
OuterClass.InterClass varName = outClassObject.new InterClass();
实例化静态内部类的形式:OuterClass.InterClass varName = new OuterClass.InterClass();
区别:创建内部类对象时,静态内部类只需使用外部类即可调用构造器,而非静态内部类必须调用外部类的对象来调用构造器。
局部内部类:局部内部类和局部变量都是只是在定义其的方法类有效,因此添不添加访问控制符没什么关系,但是java规定所有的局部成员不能使用访问控制符修饰。
匿名内部类:只能使用一次的类
固定格式: new 父类构造器(形参列表) | 实现接口()
{
//匿名内部类的类体部分
}
规定:
1. 匿名内部类必须也只只能继承一个父类或实现一个接口,而且匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。
2. 匿名内部类不能定义构造器,因为没有类名,可以通过初始化块完成构造器的工作。