内部类的概念
在A类中定义一个类B,B类就是A类的内部类;
内部类分为成员内部类,局部内部类,还有静态和非静态之分;
格式
class A{
void method(){}
class B{
void method(){}
}
}
访问内部类的成员
成员内部类:(在一个类的成员位置中定义的类)
成员内部类中内部类可以随意访问外部类,私有也可访问;
外部类访问内部类的成员方法必须创建对象访问;
访问方法:
外部类名.内部类名 对象名=new 外部类名().new 内部类名();
可以理解为:
外部类名.内部类名 对象名=外部对象.内部对象;
当成员内部类是静态时
内部类想要访问外部类,外部类必须是静态;
外部类想要访问内部类的方法时,需要将静态的成员内部类,看作外部类的静态成员:(类名直接访问成员)
外部类名.内部类名 对象名 = new 外部类名.内部类名();
非静态的成员内部类不能有静态成员!
static类型的属性和方法,在类加载的时候就会存在于内存中。
要想使用某个类的static属性和方法,那么这个类必须要加载到虚拟机- 中。
非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载。
现在考虑这个情况:在外部类并没有实例化,内部类还没有加载,这时候如果调用内部类的静态成员或方法,内部类还没有加载,
却试图在内存中创建该内部类的静态成员,这明显是矛盾的。所以非静态内部类不能有静态成员变量或静态方法。
局部内部类:
局部内部类是在成员方法里的类;
特点
1、内部类不能被public、private、static修饰;
2、在外部类中不能创建内部类的实例;
3、创建内部类的实例只能在包含他的方法中;
4、内部类访问包含他的方法中的变量必须有final修饰;
由于包含内部类的方法,其中的变量随方法的调用完毕而消失,但是局部内部类创建了实例化对象,并且通过对象调用了该方法使用该变量,由于有其他类使用该变量,该变量就应该是常量防止异常!
5、外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。
匿名内部类
概念
匿名内部类是常在局部位置使用;
格式
new 类名或接口名(){
重写抽象方法(){
}
}
其本质是继承了该抽象类的子类或者实现了该接口的子实现类的对象;
在开发中的使用案例
方法的形式参数是类的对象
在对象调用方法中,直接匿名重写方法,能省去子类
方法的返回值是抽象类/接口;
return一个该抽象类/接口的对象 new +类名(){ 方法重写 }进行匿名重写;
省去外部重写的一步;