内部类
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类。
成员内部类
成员内部类是最普通的内部类,它的定义为位于另一个类的内部。
格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
注意:当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
class Outer {
private double radius = 0;
public Outer(double radius) {
this.radius = radius;
getDrawInstance().drawSahpe(); //必须先创建成员内部类的对象,再进行访问
}
private Draw getDrawInstance() {
return new Draw();
}
class Draw { //内部类
public void drawSahpe() {
System.out.println(radius); //外部类的private成员
}
}
}
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。
成员内部类的修饰符:
private 为了保证数据的安全性
static 为了方便访问数据
注意事项:
1:静态内部类访问的外部类数据必须用静态修饰。
2: 成员方法可以是静态的也可以是非静态的
成员内部类被静态修饰后的访问方式是:
格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class Outer {
private int a = 45 ;
public void show() {
final int b = 45 ;
class Inner {
public void method(){
System.out.println(a) ;
System.out.println(b) ;
}
}
Inner i = new Inner() ;
i.method() ;
}
}
局部内部类可以直接访问外部类的成员,包括private。
可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
局部内部类访问局部变量必须用final修饰,因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。
为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
匿名内部类
匿名内部类: 就是局部内部类的简化写法。
格式:
new 类名或者接口名(){
重写方法;
} ;
本质是一个继承了该类或者实现了该接口的子类匿名对象。
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。