1. 为什么 Java 会有包的概念?
我们知道 Class
(类)是 Java 中的一等公民,所有的 Java 代码,都要写在类里面。
我们也知道,在命名规则下,你可以给类起任何名字。当你使用别人的类时,首先知道的是类名,然后再了解如何使用这个类。
随着人们编写的 Java 类越来越多,就会有个问题:如果出现了名字相同的类怎么办?两个名字相同的 User
类,其内涵是否也一样呢?如果不一样,要如何区分它们呢?
Package
(包)就是用来解决这个问题的。通过将同名的类放到不同的包里面,我们就可以:
对同名的类进行区分;
精确地指明我们需要其中的哪一个;
让同名的类在一个程序当中共存。
例如有两个 User
类,把它们分别放到包 p1
和 p2
中,就得到两个不同的类: p1.User
和 p2.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 {
// ...
}
这表示 Class1
和 Class2
都属于 p1
这个包,它们的完整类名分别是 p1.Class1
和 p1.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.Date
和 java.sql.Date
的话,那么 import 就只能适用其中的一个,另一个你还得用完整的类名。
5. 包就是文件夹
包代表的是一种树形结构的路径,而在操作系统和压缩包当中,路径都是以文件夹的形式展现的。所以对初学者来说,“包就是文件夹” 这样理解就可以了。
所以,如果一个类声明自己在 p1
包下,那么它也要放在名为 p1
的目录下,否则 Java 就会认为这是错的。
以上就是关于 Java 包的一些基础知识。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。