内部类
定义在另一个类的内部的类,把 A 类定义在 B 里内部
内部类位置
成员内部类:在成员变量定义的位置:类中方法外
局部内部类:在局部变量定义的位置:方法中
内部类的访问
1、内部类可以直接访问外部类的成员
2、外部类要访问内部类的成员,必须创建内部类对象
直接访问成员内部类的成员
格式:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
成员内部类的修饰符
private:私有,为了保护数据的安全性
static:为了方便访问数据,直接通过类名访问
静态内部类里可以有非静态方法,只是方法里必须访问静态成员
静态成员内部类的访问方式
格式:
外部类名.内部类名 对象名 = new Outer.Inner();
访问静态内部类的静态方法的简便形式:
Outer.Inner.show2();
局部内部类
访问外部类的局部变量(外部类方法的形参)加上 final(jdk1.8之前的,不包括1.8):jdk1.8开始不需要手动加上 final,因为默认会加上
为什么要加 final
1、局部变量是随着方法的调用而生成,随着方法的调用完毕而消失
2、内部类对象想要访问外部类的方法里的局部变量,这样就完全打破了 Java 的封装性
所以加上 final,就不用修改
3、内部类对象不会随着方法的调用立即消失
4、导致了内部类对象的生命周期和局部变量的生命周期不一致,所以要访问一个不存在的局部变量
5、保证两者的声明周期一致,反正 final 修饰了,谁都别想修改,于是内部类把局部变量值做个拷贝赋值给内部类里定义的一个成员变量
匿名内部类
内部类的简写
前提:存在一个类或者接口,类可以是具体类也可以是抽象类
匿名内部类格式:
new 类名或者接口名(){
重写方法;
}
本质:其实就是子类的匿名对象和实现类的匿名对象
抽象类和接口作为形参的方法:
传实参的话,其实就是传抽象类的非抽象子类或者接口的实现类
interface Person
{
public abstract void study();
}
class PersonDemo
{
public void method(Person p){
p.study();
}
}
class InnerClassDemo7
{
public static void main(String[] args)
{
PersonDemo pd = new PersonDemo();
//匿名内部类
pd.method(new Person(){
public void study(){
System.out.println("加油吧,少年!!");
}
});
}
}