嵌套类即nested class,内部类即Inner class。
概括来说,嵌套类的概念比内部类概念大。嵌套类包含内部类和非内部类。一个内部类一定是一个嵌套类,但一个嵌套类不一定是一个内部类。
在一个类内部或者接口内部声明的类是嵌套类。
下面这些类是嵌套类:
- 一个成员类;
- 一个局部类;
- 一个匿名类
一个成员类的声明被另外一个类或者接口的声明直接包围。
一个局部类的声明是被一个块(block)包含。
下面的嵌套类代码示意,包含了一个成员类、一个局部类和一个匿名类:
package com.thb;
public class Test2 {
// 匿名类,这个匿名类实际继承了MemberClass类
public MemberClass concreteMember = new MemberClass() {
public void showMessage() {
System.out.println("匿名类");
}
};
// 成员类
class MemberClass {
public void showMessage() {
System.out.println("成员类");
}
}
public void test() {
// 局部类
class LocalClass {}
}
}
上面代码编译以后的类层次结构:
内部类(Inner class)首先是一个嵌套类,并且这个类没有被显式声明为static,也不是隐含着是static的。
注意:没有内部接口,因为所有的嵌套接口都隐含着是static的。
下面这些类属于内部类:
- 一个成员类,但不是显式声明为static,也不是隐含着static的;
- 一个局部类,但不是隐含着是static的(一个局部类不能被显式声明为static的,否则编译报错);
- 一个匿名类
下面的这些嵌套类隐含着是static的,所以不是内部类:
- 一个 成员枚举类;
- 一个局部枚举类;
- 一个成员记录类;
- 一个局部记录类;
- 一个接口的成员类
用static关键字显式修饰类的时候,不能修饰外部类,也不能修饰嵌套类中的局部类和匿名类,而只能修饰嵌套类中的成员类。
当然,一些局部类(即,局部枚举类和局部record类)隐含着是static的(但就是不能用static显式修饰)。因为所有嵌套的枚举类和嵌套的record类都隐含着是static的。
如果一个嵌套类用static修饰,那么就是声明这不是一个内部类。