内部类
广泛意义上的内部类分为四种
- 实例(成员)内部类:最普通的内部类,定义为位于另一个类的内部
- 局部内部类:定义在一个方法或一个作用域里面的类
- 静态内部类:也是定义在一个类里面的类,只不过在类的前面多了一个关键字static.
- 匿名内部类:
实例(成员)内部类:
最普通的内部类,定义为位于另一个类的内部
- 可以无条件访问外部类的所有成员属性和成员方法(包括private 和static)
- 当成员内部类拥有和外部类同名的成员变量或者方法时,默认访问的时成员内部类的成员
- 如果要访问外部类的同名成员需要一下面的形式访问:1外部类.this.成员变量 2外部类.this.成员方法
- 如果外部类中要访问实例内部类的成员,必须创建一个实力内部类的对象,再通过指向这个对象的引用来访问
实例内部类是依附外部类而存在的,如果要创建实力内部类对象,前提是必须存在一个外部类对象
局部内部类:
定义在一个方法或一个作用域里面的类
局部内部类:定义在一个方法或一个作用域里面的类,它和(实例)成员内部类的区别在于局部内部类的访问仅限于方法内或该作用域内。注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、 protected、private以及static修饰符的。
静态内部类
静态内部类:也是定义在一个类里面的类,只不过在类的前面多了一个关键字static.
- 静态内部类是不需要依赖于外部类的对象的,和类的静态成员有点类似
- 它不能使用外部类的非static成员变量或者方法,因为在没有外部类的对象的情况下,是可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
匿名内部类
适合创建只需要一次使用的类
定义匿名内部类的语法格式如下:
new 父类构造器(实参列表)| 实现接口(){
//匿名内部类的类体部分
}
从定义格式可看出
匿名内部类必须继承一个父类 或实现一个接口
但最多只能继承一个父类 或实现一个接口
匿名内部类两条规则:
- 不能是抽象类
- 不能定义构造方法
可以初始化块(代码块)
由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可有初始化块(代码块)可以通过初始化块来完成构造器需要完成的工作。