# 命名包

> 原文： [https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html](https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html)

随着全世界程序员使用 Java 编程语言编写类和接口，许多程序员可能会对不同类型使用相同的名称。事实上，前面的例子就是这样：当`java.awt`包中已经有`Rectangle`类时，它定义了一个`Rectangle`类。尽管如此，编译器允许两个类在不同的包中具有相同的名称。每个`Rectangle`类的完全限定名称包括包名称。也就是说，`graphics`包中`Rectangle`类的完全限定名称是`graphics.Rectangle`，`java.awt`包中`Rectangle`类的完全限定名称是`java.awt.Rectangle`。

除非两个独立的程序员为其包使用相同的名称，否则这很有效。什么阻止了这个问题？惯例。

## 命名约定

包名称全部用小写编写，以避免与类或接口的名称冲突。

公司使用他们的反向互联网域名来开始他们的包名称 - 例如，`com.example.mypackage`用于由程序员在`example.com`创建的名为`mypackage`的包。

在单个公司内发生的名称冲突需要通过公司内的约定来处理，可能是通过在公司名称后面包含区域或项目名称（例如，`com.example.region.mypackage`）。

Java 语言中的包本身以`java.`或`javax.`开头

在某些情况下，互联网域名可能不是有效的包名。如果域名包含连字符或其他特殊字符，如果包名称以数字或其他非法用作 Java 名称开头的字符开头，或者包名称包含保留的 Java 关键字，则会发生这种情况，例如“int”。在这种情况下，建议的约定是添加下划线。例如：

Legalizing Package Names
| 域名 | 包名称前缀 |
| --- | --- |
| `hyphenated-name.example.org` | `org.example.hyphenated_name` |
| `example.int` | `int_.example` |
| `123name.example.com` | `com.example._123name` |