跳到主要内容

Java 中的内部类有什么用?

· 阅读需 3 分钟
一介布衣
全栈开发者 / 技术写作者

  • 文章目录

    • 什么是内部类
    • 为什么需要内部类
    • 内部类有何优势
    • 内部类的分类
      • 静态内部类
      • 匿名内部类
  • 什么是内部类

把类定义在另一个类的内部,该类就被称为内部类.
非常重要的一点是,内部类能够访问外部类的所有成员,包括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();
}
}