内部类(nested class)
内部类是包括三种:静态内部类,非静态内部类和匿名内部类,其中声明为static的内部类为静态内部类,而不带有static声明的内部类为非静态内部类,具体的代码片段声明如下:
1.非静态内部类
代码形式:OuterClass {//内部类
...
public class NestedClass {
...
}
private class PrivateNestedClass{
....
}
}
特点:
(1)非静态内部类的实例化是需要建立在外部类的已经实例化的基础之上,也可说非静态内部类相当于外部类的实例对象的变量,具体的操作如下:OuterClass.NestedClassinnerObject = outerObject.new NestedClass();
(2)非静态内部类自动拥有其外围类的所有成员访问权(这个是编译器帮你处理的)
(3)如果是private属性的内部类阻止了任何依赖于类型的编码,并且完全隐藏了实现细节,不能向下转型的。
(4)非静态内部类也可以定义到方法中和代码的作用域中(例如if...else...作用域)这里需要注意的是内部类在作用域之外是不可用的,在方法中定义使用方法参数时必须声明为final字段。
(5)非静态内部类的不允许有static方法和static变量存在,但可以允许static final常量存在。2.静态内部类(嵌套类)
class OuterClass {
...
public static class StaticNestedClass {
...
}
}
静态内部类的访问是需要借助外部类间接访问的。eg:OuterClass.StaticNestedClass
同样静态内部类的实例化也是借助外部类的。
eg:OuterClass.StaticNestedClassnestedObject =newOuterClass.StaticNestedClass();
需要注意的是可以使用import OuterClass.StaticNestedClass,导入静态内部类。
(1)静态内部类只能访问外围类的静态方法和静态变量。
(2)静态内部类与外围类联系很少,外部类需要使用内部类,而内部类无需使用外部类的资源。
(3)静态内部类没有外部对象的引用,所以它无法获得外部对象的资源,当然好处是,静态内部类无需依赖于外部类,它可以独立于外部对象而存在。3.匿名内部类
匿名类是由于无需声明类的名称而来,匿名类可以定义为静态的也可以定义为非静态的,静态的匿名类性质上与静态内部类相同,非静态匿名类性质上与非静态内部类相同。(注:这里的静态匿名类指的是匿名类的引用声明为static的)
代码形式:
public class AnonymousClass {
Base anonymous=new Base() {
};
}
abstract class Base{
public Base(){
}
}
(1)对于匿名类是不能重载实例化初始方法的,所以只能有一个构造器。
(2)匿名类与正常的类继承相比既可以扩展类,也可以实现接口但不能两者具备。
4.静态内部类和非静态内部类区别和使用场景
(1)由于静态内部类无需使用外部类的资源,静态内部类可以独立外部类创建对象使用静态内部类的好处是加强了代码的封装性以及提高了代码的可读性。而非静态内部类可以隐性的访问外围类的属性和方法,与外围类有着千丝万缕的联系,它 可以间接的解决了类的单重继承问题,扩充继承类的数量和接口实现的数量,尤其是非静态匿名类在基于事件驱动的类上有着广泛的应用。