1. 类
Java有各种各样类,如:顶级类、嵌套类、内部类、成员类、局部类(本地类)、静态类、匿名类、文件类以及这些组合起来的称呼类,成员内部类,成员匿名类,成员嵌套类,匿名内部类等
1.1 顶级类
顶级类(Top Level Class
)是在编译单元中直接声明的类。
A top level class is a class declared directly in a compilation unit. 1
或者说非嵌套类即为顶级类
public class Main( )
class Test( )
在一个.java
文件中直接申明的类就是顶级类,这个类不嵌套在任何其他类中。
在顶级类中如果是与文件名相同的public
类,也可称为: 文件类(File class)
- 文件类
由于这个类与文件名直接对应,可以看作是这个文件的类,因此也可以称之为文件类。
在声明顶级类时,如果包含protected
、private
、或者static
关键字都会产生一个编译时错误。
1.2 嵌套类
嵌套类(Nest Class)是指其声明出现在另一个类或接口声明的主体中的任何类。嵌套类可以是内部类、成员类、局部类或匿名类。
A nested class is any class whose declaration occurs within the body of another class
or interface declaration.
嵌套类中还可以声明类,被声明的类也是嵌套类。简单的说就是:不是顶级类就是嵌套类。嵌套类声明所在的类被称为外部类。
嵌套类可分为两种:
- 静态嵌套类(
Static Nested Class
)
用static
修饰符声明在外部类里面的类,这个嵌套类可以不依赖与外部类实例而独立存在。 - 内部类
1.3 静态嵌套类
在Java中,静态嵌套类(Static Nested Class)是声明另一个类中的用Static
修饰的嵌套类。
public class OuterClass{static class StaticNestedClass { } // 静态嵌套类
}
静态嵌套类的特点是:
- 可以使用
static
修饰符修饰,表示这个嵌套类可以独立与外部类存在; - 可以不需要外部类的实例而被直接实例化;
- 不能直接访问外部类的非静态成员属性和方法;
- 外部类需要使用嵌套类名.静态方法 来访问静态嵌套类;
- 编译时会将静态嵌套类编译成 OuterClass$StaticNestedClass.class 文件;
- 静态嵌套类常一般用于无需访问外部类成员的工具类
实际上,静态嵌套类在行为上是一个顶级类,为了封装方便,它已经嵌套在另一个顶层类中。
1.4 内部类
内部类(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
)、初始化器(Init ializer
)中
1.5 成员类
成员类(
Member Class
)是一个类,其声明直接包含在另一个类或接口声明的主体中。成员
类可以是普通类、枚举类或记录类
A member class is a class whose declaration is directly enclosed in the body of
another class or interface declaration
成员类可以使用static修饰,从技术角度讲成员类应该还包括静态嵌套类
1.6 局部类(本地类)
局部类( Local Class
)是声明在块( Block
)中的类。也就是在块( {}
)、构造器( Construc tor
)、方法( 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
修饰。
1.7 匿名类
匿名类( Anonymous Class
)就是没有名称的类,其名称由Java编译器给出,一般是形如:外
部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一
次。所有的匿名类都是内部类。
An anonymous class declaration is automatically derived from a class instance
creation expression by the Java compiler. (jls11)
匿名类不能具有显式声明的构造函数
2. 总结
-
嵌套类:声明在类内部的类。
-
静态嵌套类,唯一的一种静态类
-
非静态嵌套类即为内部类
-
-
成员类:位于类内部但不包括位于块、构造器、方法、初始化器内的类
-
局部类:声明在块( {} )、构造器( Constructor )、方法( method )、初始化器( Initializer )中
-
匿名类:类内无名称类
- 成员匿名类
- 局部匿名类