Java有各种各样类,如:顶级类、嵌套类、内部类、成员类、局部类(本地类)、静态类、匿名类、文件类以及这些组合起来的称呼类,成员内部类,成员匿名类,成员嵌套类,匿名内部类等,但有些其实是一个意思,在这里好好理一理。(本文只对定义进行区分,不深入研究其使用)
以上所有的名词都是翻译过来的,所以可能会有不同叫法,这里我使用 Java 17 语言规范上说的
顶级类(Top Level Class
)是在编译单元中直接声明的类。
A top level class is a class declared directly in a compilation unit.
或者说 非嵌套类即为顶级类
什么是顶级类呢?以下代码声明的都是顶级类。
public class Main{} class Test{}
在一个.java
文件中直接声明的类就是顶级类,这个类不嵌套在任何其他类中。
在顶级类中如果是与文件名相同的public
类,也可以称为:
由于这个类与文件的名字直接对应,可以看作是代表这个文件的类,因此也可以称之为文件类。Java语言规范没找到相关定义
注意:也有将文件类称为 主类(Main class)的,但本人觉得不太恰当。主类是指包含了
public static void main(String[] args)
方法的类,main
方法是程序执行的入口,因此可以称之为主类。另外, 也有根据类的访问修饰符将其称为 公开类(Public class,被public修饰,对所有程序可见)、默认类(Default class 没有访问修饰符,默认只在包内可见)、非公开类(Non-public class,这个类没有public修饰,是非公开的)的,这些名称都反映了这个类所具有的某种特点或属性,我们可以根据上下文选择使用最合适的那个名称。
在声明顶级类时,如果包含protected
、private
或static
关键字都会产生一个编译时错误。
嵌套类(Nested Class
)是指其声明出现在另一个类或接口声明的主体中的任何类。嵌套类可以是内部类、成员类、局部类或匿名类。
A nested class is any class whose declaration occurs within the body of another class or interface declaration.
嵌套类中还可以声明类,被声明的类也是嵌套类。简单说就是不是顶级类就是嵌套类。嵌套类声明所在的类被称为外部类。
嵌套类可以分为两种:
Static Nested Class
)
用static
修饰符声明在外部类里面的类,这个嵌套类可以不依赖于外部类实例而独立存在。[ JLS-8.1.1.4 ]
在Java中,静态嵌套类(Static Nested Class
)是声明在另一个类中的用static
修饰的嵌套类。
public class OuterClass { static class StaticNestedClass {} // 静态嵌套类 }
静态嵌套类的特点是:
static
修饰符修饰, 表示这个嵌套类可以独立于外部类存在。实际上,静态嵌套类在行为上是一个顶级类,为了封装方便,它已经嵌套在另一个顶层类中。
内部类(Inner Class
)是一个嵌套类,它不是显式或隐式静态的。即非静态嵌套类即为内部类
An inner class is a nested class that is not explicitly or implicitly static
内部类包括: 非静态成员类(non-static member class
)、局部类(Local class
)、匿名类(anonymous class
)
以下嵌套类是隐式静态的,因此不是内部类:
member enum class
)local enum class
)member record class
)member class of an interface
)内部类可以定义在块(
{}
)、构造器(Constructor
)、方法(method
)、初始化器(Initializer
)中
成员类(Member Class
)是一个类,其声明直接包含在另一个类或接口声明的主体中。成员类可以是普通类、枚举类或记录类
A member class is a class whose declaration is directly enclosed in the body of another class or interface declaration
成员类可以使用
static
修饰,从技术角度讲成员类应该还包括静态嵌套类
局部类(Local Class
)是声明在块(Block
)中的类。也就是在块({}
)、构造器(Constructor
)、方法(method
)、初始化器(Initializer
)中声明的类
A local class is a nested class (§8 (Classes)) whose declaration is immediately contained by a block (§14.2).
局部类不能使用public
、protected
、private
、static
修饰。
匿名类(Anonymous Class
)就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次。所有的匿名类都是内部类。
An anonymous class declaration is automatically derived from a class instance creation expression by the Java compiler. (jls11)
匿名类不能具有显式声明的构造函数
本文讨论的类是根据其类声明来划分的:
{}
)、构造器(Constructor
)、方法(method
)、初始化器(Initializer
)中
语言规范参考:
类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html
顶层类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-7.html#jls-7.6
嵌套类
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
内部类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.1.3
成员类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.5
成员类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-9.html#jls-9.5
局部类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-14.html#jls-14.3
匿名类
https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.9.5
powered by kaifamiao