我们正常的类都是定义在一个个的java文件中,内部类,顾名思义,就是在类中定义的类。根据内部类定义位置的不同,可以将内部类分成员内部类,静态内部类,局部内部类以及匿名内部类。
成员内部类
定义位置
类中,方法外
语法
访问权限修饰符 修饰符 类名 extends 父类名 implements 接口。。。。{ }
注意
- 在成员内部类中,成员内部类可以定义非静态成员,包括非静态常量,非静态方法,非静态代码块,构造函数。
- 如果成员内部类中的属性名与外部类中的属性名一直,外部类的属性名用,外部类类名.this.属性名区分,内部类的属性名前加this,同名方法名一致。
创建对象
内部类所在的外部类中创建对象:
内部类类名 对象名 = 外部类对象.new 内部类构造函数();
内部类所在的外部类外创建对象:
外部类类名.内部类类名 对象名 = 外部类对象.new 内部类构造函数();
静态内部类
定义位置
类中方法外
语法
访问权限修饰符 static 类名 extends 父类名 implements 接口。。。。{ }
注意
- 静态内部类中不能直接使用外部类的非静态成员。
- 如果静态内部类中的静态属性或方法和外部类中的静态属性或方法同名,在内部类中想要调用外部类的方法需要外部类类名.属性名
创建对象
外部类类名.内部类类名 对象名 = new 外部类类名.内部类构造函数名();
局部内部类
定义位置
类中,方法中
语法
class 类名 extends 父类名 implements 接口。。。。{}
注意
- 局部内部类中不能定义静态成员,包括静态属性,静态方法,静态代码块。
- 局部内部类中的属性和外部类的属性名重名时,在内部类中调用外部类属性,需要用外部类类名.this.属性名用以区分
- 局部内部类是定义在方法中的,在定义的方法外无法调用这个内部类。
创建对象
内部类类名 对象名 = new 内部类构造函数();
匿名内部类
定义位置
类中,实参或值。
语法
new 父类名\接口名(){}
注意
匿名内部类相当于将 类继承父类,实现接口,创建子类对象并转换为父类对象或接口对象合并成一步。类似于我们创建匿名对象一样,匿名内部类同样没有类名。
因此我们在匿名内部类中无法定义构造函数,只能使用JVM提供的无参构造。