开发喵星球

Java中各种类

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 类,也可以称为:

注意:也有将文件类称为 主类(Main class)的,但本人觉得不太恰当。主类是指包含了public static void main(String[] args)方法的类, main方法是程序执行的入口,因此可以称之为主类。

另外, 也有根据类的访问修饰符将其称为 公开类(Public class,被public修饰,对所有程序可见)、默认类(Default class 没有访问修饰符,默认只在包内可见)、非公开类(Non-public class,这个类没有public修饰,是非公开的)的,这些名称都反映了这个类所具有的某种特点或属性,我们可以根据上下文选择使用最合适的那个名称。

在声明顶级类时,如果包含protectedprivatestatic关键字都会产生一个编译时错误。

嵌套类

嵌套类(Nested Class)是指其声明出现在另一个类或接口声明的主体中的任何类。嵌套类可以是内部类、成员类、局部类或匿名类。

 
A nested class is any class whose declaration occurs within the body of another class or interface declaration.

嵌套类中还可以声明类,被声明的类也是嵌套类。简单说就是不是顶级类就是嵌套类。嵌套类声明所在的类被称为外部类。

嵌套类可以分为两种:

静态嵌套类

在Java中,静态嵌套类(Static Nested Class)是声明在另一个类中的用static修饰的嵌套类。

 public class OuterClass {     static class StaticNestedClass {} // 静态嵌套类 }

静态嵌套类的特点是:

  1. 可以使用static修饰符修饰, 表示这个嵌套类可以独立于外部类存在。
  2. 可以不需要外部类的实例而被直接实例化。
  3. 不能直接访问外部类的非静态成员属性和方法。
  4. 外部类需要使用 嵌套类名.静态方法 来访问静态嵌套类。
  5. 编译时会将静态嵌套类编译成 OuterClass$StaticNestedClass.class 文件。
  6. 静态嵌套类常一般用于无需访问外部类成员的工具类。

实际上,静态嵌套类在行为上是一个顶级类,为了封装方便,它已经嵌套在另一个顶层类中。

内部类

内部类(Inner Class)是一个嵌套类,它不是显式或隐式静态的。即非静态嵌套类即为内部类

 
An inner class is a nested class that is not explicitly or implicitly static

内部类包括: 非静态成员类(non-static member class)、局部类(Local class)、匿名类(anonymous class)

以下嵌套类是隐式静态的,因此不是内部类:

内部类可以定义在块({})、构造器(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).

局部类不能使用publicprotectedprivatestatic修饰。

匿名类

匿名类(Anonymous Class)就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次。所有的匿名类都是内部类。

 An anonymous class declaration is automatically derived from a class instance creation expression by the Java compiler. (jls11)

匿名类不能具有显式声明的构造函数

总结

本文讨论的类是根据其类声明来划分的:

语言规范参考:

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

   
分类:Java/OOP 作者:开发喵 发表于:2023-09-03 20:55:34 阅读量:89
<<   >>


powered by kaifamiao