基础概念

使用要点

  1. 内部类是一种特殊的类,指定义在一个类内部的类
  2. 在实际开发中,为了便于使用外部类的属性和方法,这时我们通常会定义一个内部类。内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性
  3. 内部类提供了更好的封装只能让外部类直接访问

    分类

    成员内部类

    非静态内部类

  • 非静态内部类不能有静态方法、静态的属性、静态初始化块
  • 使用要点

    • 内部类通过 外部类名.this.属性名,访问外部类的私有属性方法
    • 非静态内部类的对象必须寄存在一个外部类对象里,创建过程是先创建外部类对象,然后使用外部类对象创建内部类对象,创建该对象语法结构为 外部类名.内部部类名 对象名称 = new 外部类名().new 内部部类名()

      1. public class Outer1 {
      2. private int age = 18;
      3. public void show(){
      4. System.out.println("外部类,age:"+age);
      5. }
      6. //内部类。定义在外部类Outer1里面
      7. //非静态内部类不能有静态的方法、静态的属性、静态初始化块
      8. class Inner1 {
      9. private int id = 10001;
      10. private int age = 28;
      11. public void test1(){
      12. System.out.println("Inner1.test1");
      13. System.out.println("内部类的属性,age:"+this.age);
      14. System.out.println("外部类的属性,age:"+Outer1.this.age);
      15. //通过:外部类名.this.属性名,访问外部类的属性
      16. Outer1.this.show();
      17. }
      18. }
      19. }

      静态内部类

  • 定义方式

    1. static class ClassName {
    2. //类体
    3. }
  • 使用要点

    • 静态内部类可以访问外部类的静态成员(可私有),不能访问外部类的普通成员
    • 静态内部类看作是一个外部类的一个静态成员,该类内部可以有成员方法
    • 创建静态内部类的语法是 外部类名.内部部类名 对象名称 = new 外部类名.内部部类名()

      匿名内部类

  • 适合那种只需要使用一次的类。比如键盘监听操作等,在安卓开发 awt swing GUI里开发中常见

  • 例如基于某接口的实现类定义后直接使用一次(定义的位置就是使用的位置)

    1. new 接口名(){
    2. @Override
    3. public void 方法名(){
    4. //一次性方法体
    5. }
    6. }

    ```java public class TestAnonymousInnerClass {

    public void test(A3 a){

    1. System.out.println("TestAnonymousInnerClass.test");
    2. a.run();

    }

    public static void main(String[] args) {

    1. TestAnonymousInnerClass tc = new TestAnonymousInnerClass();
    2. //匿名内部类只使用一次!!
    3. tc.test(new A3() {
    4. @Override
    5. public void run() {
    6. System.out.println("匿名内部类的run()");
    7. }
    8. });
    9. tc.test(new A3() {
    10. @Override
    11. public void run() {
    12. System.out.println("TestAnonymousInnerClass.run");
    13. }
    14. });

    } }

interface A3 { void run(); }

```

局部内部类

  • 局部内部类定义在方法内部,作用域只限于本方法
  • 局部内部类在实际开发中很少使用