Skip to content

内部类

内部类(Inner Class)是定义在另一个类内部的类。

Java 提供内部类的主要目的是为了更好地将类逻辑封装在一起,增强代码的可读性和维护性。根据其定义的位置和特性,内部类可以分为以下几种类型:

  • 静态内部类
  • 成员内部类
  • 局部内部类

静态内部类

使用 static 修饰。它不能直接访问外部类的非静态成员,只能访问外部类的静态成员。

java
public static void main(String[] args) {
  Person.Dog dog = new Person.Dog();
  dog.eat(); //篮球
}

class Person {
  static String hobby = "篮球";

  //静态成员内部类
  static class Dog {
    public void eat() {
      System.out.println("name = " + Person.hobby);
    }
  }
}

成员内部类

定义在类的内部,且不带 static 修饰符。它可以访问外部类的所有成员(包括私有成员)。

java
public static void main(String[] args) {
  Person person = new Person();
  Person.Cat cat = person.new Cat();
  cat.eat();
  cat.show("王一博");
}

class Person {
  String name = "Person";
  int age = 10;

  //非静态成员内部类
  class Cat {
    String name = "Cat";

    public void show(String name) {
      System.out.println("age = " + age); 		         //10
      System.out.println("name = " + name);            //王一博
      System.out.println("name = " + this.name);       //Cat
      System.out.println("name = " + Person.this.name);//Person
    }
  }
}

局部内部类

定义在方法、构造器或代码块中,其作用域仅限于定义它的块中。

java
class Person {
  //方法中
  public void method() {
    class A {
    }
  }

  //构造器中
  public Person() {
    class B {
    }
  }

  //代码块中
  {
    class C {
    }
  }
}

使用场景

注意

要学会看 匿名内部类 的声明和使用方式,实际开发的时候可能会用到的!

java
class InnerClass {
  public Comparable comparable() {
    //方式一:接口实现类的实名对象(标准写法)
    class MyComparable implements Comparable {
      @Override
      public int compareTo(Object o) {
        return 0;
      }
    }
    MyComparable myComparable = new MyComparable();
    return myComparable;

    //方式二:接口实现类的匿名对象
    class MyComparable implements Comparable {
      @Override
      public int compareTo(Object o) {
        return 0;
      }
    }
    return new MyComparable();

    //方式三:接口匿名实现类的实名对象
    Comparable comparable = new Comparable() {
      @Override
      public int compareTo (Object o){
        return 0;
      }
    };
    return comparable;

    //方式四:接口匿名实现类的匿名对象
    return new Comparable() {
      @Override
      public int compareTo(Object o) {
        return 0;
      }
    };
  }
}

Released under the MIT License.