Java:内部类分类
有名内部类
1.概念:
内部类:指在一个外部类内定义的类。
2.按照是否有类名分为有名内部类和匿名内部类。
有名内部类:
匿名内部类
1.匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:
new 父类构造器([参数列表])|接口(){
//匿名内部类类体
}
2. 概念:
⑴普通类:普通类匿名内部类实质为普通类的子类
注:调用Mammal中的无参构造方法
⑵抽象类:抽象类匿名内部类实质为抽象类的子类。
⑶接口:接口匿名内部类实质为接口的实现类。
3.匿名内部类特点:
- 匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类,其中new 关键字后面的类名或接口名即是该匿名内部类继承的父类或实现的接口;
- 匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量;
- 匿名内部类一定不能是抽象类;
- 可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用,例如:
注:同一个匿名内部类对象只能调用一个新增的属性或方法,无法再调用实现的抽象方法、重写的方法或继承的方法,也无法调用继承的属性
静态内部类
1.按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,非静态内部类前面已经讲过,这里不再赘述。
静态有名内部类:
静态匿名内部类
注意:
⑴如果为static内部类只能直接定义在外部类中。
⑵静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
注:
红框:由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对
紫框:由于print方法为静态方法,所以可以直接使用。
⑶在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。
注:程序出错,因为内部类作用范围无法作用到这里。
⑷只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。