一 内部类
1. 如果A类需要直接访问B类中的成员 而B类又需要建立A类的对象 这时 为了方便设计和访问 直接将A类定义在B类中 就可以了 A类就称为内部类 内部类可以直接访问外部类中的成员 而外部类想要访问内部类 必须要建立内部类的对象
class Outer { int num = 4; class Inner { void show() { System.out.println("inner show run " + num); } } public void method() { Inner in = new Inner();//创建内部类的对象 in.show();//调用内部类的方法 } }
2. 当内部类定义在外部类中的成员位置上 可以使用一些成员修饰符修饰 private, static
1> 默认修饰符
直接访问内部类格式 外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer.new Inner(); //这种形式很少用
但是这种应用不多见 因为内部类之所以定义在内部就是为了封装 想要获取内部类对象通常都通过外部类的方法来获取 这样可以对内部类对象进行控制
2> 私有修饰符
通常内部类被封装 都会被私有化 因为封装性不让其他程序直接访问
3> 静态修饰符
如果内部类被静态修饰 相当于外部类 会出现访问局限性 只能访问外部类中的静态成员
注意: 如果内部类中定义了静态成员 那么该内部类必须是静态的
3. 内部类编译后的文件名为 "外部类名$内部类名.java"
4. 内部类可以直接访问外部类中的成员
那是因为内部中都持有一个外部类的引用 这个是引用是 外部类名.this
内部类可以定义在外部类中的成员位置上 也可以定义在外部类中的局部位置上
当内部类被定义在局部位置上 只能访问局部中被final修饰的局部变量
二 匿名内部类
1. 没有名字的内部类 就是内部类的简化形式 一般只用一次就可以用这种形式 匿名内部类其实就是一个匿名子类对象 想要定义匿名内部类 需要前提 内部类必须继承一个类或者实现接口
2. 匿名内部类的格式 new 父类名&接口名() { 定义子类成员或者覆盖父类方法 }.方法
3. 匿名内部类的使用场景
当函数的参数是接口类型引用时 如果接口中的方法不超过3个 可以通过匿名内部类来完成参数的传递
其实就是在创建匿名内部类时 该类中的封装的方法不要过多 最好两个或者两个以内