将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构

  1. class 外部类 {
  2. class 内部类 {
  3. }
  4. }

访问特点

  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 外部类要访问内部类的成员,必须要建立内部类的对象。

    创建内部类对象格式

    外部类名 对象名 = new 外部类名();
    外部类名.内部类名 对象名 = 外部类型().new 内部类型();
    

    ``` public class Person { private boolean live = true;

    public Person() { }

    public Person(boolean live) {

      this.live = live;
    

    }

    public boolean isLive() {

      return live;
    

    }

    public void setLive(boolean live) {

      this.live = live;
    

    }

    class Heart {

      public void jump() {
          if (live) {
              System.out.println("心脏跳动");
          } else {
              System.out.println("心脏停止");
          }
      }
    

    } }

```
public class Test {
    public static void main(String[] args) {
        //创建外部类
        Person p = new Person();
        //创建内部类
        Person.Heart h = p.new Heart();
        h.jump();
        p.setLive(false);
        h.jump();
    }
}

匿名内部类

匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。
开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,

  1. 定义子类
  2. 重写接口中的方法
  3. 创建子类对象
  4. 调用重写后的方法

格式

new 父类名或者接口名() {
        // 方法重写     
        @Override      
        public void method() {         
                // 执行语句     
        } 
};

使用方式

public abstract class FlyAble {
    public abstract void fly();
}

创建匿名内部类,并调用

public class Test {
    public static void main(String[] args) {
        FlyAble f = new FlyAble() {
            @Override
            public void fly() {
                System.out.println("fly");
            }
        };
        f.fly();
    }
}