Java 中的内部类有什么用?


文章目录



什么是内部类

把类定义在另一个类的内部,该类就被称为内部类.
非常重要的一点是,内部类能够访问外部类的所有成员,包括private修饰的.


为什么需要内部类

Java的内部类让我很容易的想起来JavaScript的闭包,闭包就是定义在一个函数内部的函数——这听起来和Java的内部类定义一样一样的.
本质上,闭包是将函数内部与函数外部连接起来的桥梁.
内部类一样,它是将内部类与外部类连接起来的桥梁.


内部类有何优势

  • 内部类可以直接访问外部类中的成员(包括私有成员),
  • 内部类可以独立地继承一个抽象类或者实现一个接口,无论外部类是否也这样做了,对内部类都没有影响.
  • 可以模拟实现多继承

我们知道C++中是多继承,java是单继承,利用内部类我们可以模拟实现java的多继承

public abstract class F {
}

public abstract class F1 {
}

public Class Outer{
    class Fextends extends F{

    }
    class F1extends extends F1{

    }
    private F f;   
    private F1 f1;    
}

上面Outer 类简单的实现了多继承.


内部类的分类


静态内部类

被 static 所修饰的内部类,按位置分,属于成员内部类.
但也可以称作静态内部类,也常叫做嵌套内部类.

即使没有外部类对象,也可以创建静态内部类对象,而外部类的非static成员必须依赖于对象的调用,静态成员则可以直接使用类调用,不必依赖于外部类的对象,所以静态内部类只能访问静态的外部属性和方法.

class Outter {
      int age = 10;
      static age2 = 20;
      public Outter() {        
      }
       
      static class Inner {
          public method() {
              System.out.println(age);//错误
              System.out.println(age2);//正确
          }
      }
  }
  ​
  public class Test {
      public static void main(String[] args)  {
          Outter.Inner inner = new Outter.Inner();
          inner.method();
      }
  }

上面程序输出结果中,method() 只能访问 age2 变量,因为内部静态类只能访问静态的外部属性和方法.


匿名内部类

一个没有名字的类,是内部类的简化写法

new 类名或者接口名() {
      重写方法();
  }

本质:其实是继承该类或者实现接口的子类匿名对象

interface Inner {
      public abstract void show();
  }
  ​
  class Outer {
      public void method(){
          new Inner() {
              public void show() {
                  System.out.println("HelloWorld");
              }
          }.show();
      }
  }
  ​
  class Test {
      public static void main(String[] args)  {
          Outer o = new Outer();
          o.method();
      }
  }

出自:Java 中的内部类有什么用?

回到顶部