一:内部类基础
定义:java中,将一个类定义在一个类内部的类叫内部类。
位置:1->成员位置处 2->方法体内 3->方法参数位置
种类:成员内部类、局部内部类、匿名内部类、静态内部类
二:成员内部类
定义在成员位置处的类。
Circle类称为外部类,成员内部类可以无条件访问外部类的所有成员属性和方法(包括private成员和静态成员)。
当成员内部类和外部类有同名成员变量或方法时,默认访问成员内部类的成员。
若要访问外部类成员,需要以下形式进行访问。
外部类.this.成员变量
外部类.this.成员方法
外部类访问内部类成员,需要创建内部类对象进行访问。
创建内部类对象的方式:
1:Outer.Inner inner = new Outer().new Inner();
2:Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
成员内部类可以被public、protected、默认访问修饰符、private修饰。
public:本类、同包类、子类、不同包
protected:本类、同包类、子类(不同包中的子类亦可)
默认:本类、同包类
private:本类
外部类只可以被public和默认访问修饰符修饰,且同一文件下至多有一个public修饰的类。
三:局部内部类
定义在方法体内部的类,访问权限仅限于方法内。
注:局部内部类就像方法中的局部变量一样,不能有public、protected、private和static修饰符。
四:匿名内部类
匿名内部类就是没有名字的内部类。
因为没有名字,因此每次调用只能使用一次,常常用来简化代码编写。
使用匿名内部类有个前提条件:必须继承父类或实现一个接口,或者继承父类且父类方法可重写。
例1:不使用匿名内部类
例2:在抽象类上使用匿名内部类
例3:在接口上使用匿名内部类
例3:在可继承类且父类方法可重写的类上使用匿名内部类
匿名内部类不能有访问修饰符和关键字static修饰,匿名内部类是唯一没有构造器的类,多数情况下用在接口回调。
五:静态内部类
定义在类中,并且用static修饰符修饰。
和类的静态成员类似,在没有外部类的对象情况下,可以创建内部类的对象,创建方式如下:
Outer.Inner inner = new Outer.Inner();
静态内部类不能使用外部类的非ststic成员属性和方法。
例: