1

1. 为什么 Java 会有包的概念?

我们知道 Class(类)是 Java 中的一等公民,所有的 Java 代码,都要写在类里面。

我们也知道,在命名规则下,你可以给类起任何名字。当你使用别人的类时,首先知道的是类名,然后再了解如何使用这个类。

随着人们编写的 Java 类越来越多,就会有个问题:如果出现了名字相同的类怎么办?两个名字相同的 User 类,其内涵是否也一样呢?如果不一样,要如何区分它们呢?

Package (包)就是用来解决这个问题的。通过将同名的类放到不同的包里面,我们就可以:

  1. 对同名的类进行区分;

  2. 精确地指明我们需要其中的哪一个;

  3. 让同名的类在一个程序当中共存。

例如有两个 User 类,把它们分别放到包 p1p2 中,就得到两个不同的类: p1.Userp2.User

所以,包的存在对于 Java 语言来说是非常重要的,没有它,Java 的世界将会十分混乱,我们可能会遇到同名的类冲突,可能会为了避免这种情况而给类起一个非常长的名字。不管怎样这都是十分痛苦的。

2. 包是类的一部分

为什么这么说呢?因为每个类都会属于一个包,那些没有指定属于哪个包的类,我们认为它们属于缺省包(default package)。实际上,一个完整的类名就是包名与类名的组合。比如当我们说 Date 类时,通常指的是 java.util.Date 类。要使用这个类,我们需要给出完整的类名。下面是一个例子:

public static void main(String[] args) {
    System.out.println("现在是 " + new java.util.Date());
}

上面的例子涉及到两个类,一个是 System,一个是 Date。为什么后者要给出完整类名,而前者不需要呢?因为 Java 有个规定:凡是在 java.lang 包下面的类,使用时都无需给出完整类名。这里的 System 类,指的就是 java.lang.System,所以只要写类名就可以了。

3. 声明类属于哪个包

我们可以在 java 文件的最开头声明这个 java 文件中的类属于哪个包。如果文件当中有多个类,那么它们都属于这个包。例如一个文件 Class1.java 内容如下:

package p1;

public class Class1 {
    // ...
}

class Class2 {
    // ...
}

这表示 Class1Class2 都属于 p1 这个包,它们的完整类名分别是 p1.Class1p1.Class2

4. import 是一种简写规则

因为写完整的类名仍然是比较痛苦的一件事(当然比没有包的概念还是舒服多了),所以 Java 又增加了一个方便编码的规则:import

import 的用法,简单的说就是,在源代码的开头声明了 import java.util.Date;之后,下面的源代码中使用 Date 类就无需用完整的类名了:

import java.util.Date;

public static void main(String[] args) {
    System.out.println("现在是 " + new Date());
}

所以 import 的作用很简单,就是省略包名,减少不必要的重复。不过它不是万能的,如果你要在一个 java 文件中同时使用 java.util.Datejava.sql.Date 的话,那么 import 就只能适用其中的一个,另一个你还得用完整的类名。

5. 包就是文件夹

包代表的是一种树形结构的路径,而在操作系统和压缩包当中,路径都是以文件夹的形式展现的。所以对初学者来说,“包就是文件夹” 这样理解就可以了。

所以,如果一个类声明自己在 p1 包下,那么它也要放在名为 p1 的目录下,否则 Java 就会认为这是错的。

以上就是关于 Java 包的一些基础知识。


捏造的信仰
2.8k 声望272 粉丝

Java 开发人员