内部类
Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类称为内部类的外嵌类。
内部类和外嵌类的关系:
- 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法
- 内部类的类体中不可以声明类变量和类方法(static)。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员
- 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象
- 内部类对应的字节码文件的名字格式是:“外嵌类名$内部类名”
- 内部类可以被修饰为static内部类,类是一种数据类型,那么static内部类就是外嵌类中的一种静态数据类型,这样,程序就可以在其他类中使用static的内部类来创建对象了。static内部类不能操作外嵌类中的实例成员变量。
注意:非内部类不可以是static类
匿名类
1.和子类有关的匿名类
假如没有显式地声明一个类的子类,而又想用子类创建一个对象,那么该如何实现这一目的呢?
Java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法还能使用类体,这个类体就叫做匿名类,匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象。
假设Animal是一个类,那么下列代码就是用Animal的一个子类(匿名类)创建对象。
new Animal(){
//匿名类的类体
}
匿名类特点:
- 匿名类可以继承父类的方法,也可以重写父类的方法
- 使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类
- 匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法
- 由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法
2.和接口有关的匿名类
假设一个Comparator是一个接口,那么,java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Comparator接口的类去掉类声明的类体,称作匿名类。下列代码就是用实现了Comparator接口的类(匿名类)创建对象。
new Comparator(){
//实现接口的匿名类的类体
}
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口的全部方法。例如,对于void f(Comparator x),其中的参数x是接口,那么在调用f时,可以向f的参数x传递一个匿名对象,如:f(new Comparator(){实现接口的匿名类的类体}。可以具体参考实例https://blog.csdn.net/qq_36923376/article/details/88820699