1. 套餐

普通的 Java 程序涉及大量的类。多少?几千,几万。而且,如果您还考虑到该程序使用了包含其他程序员编写的类的各种库,那么类的数量很容易以数百万计!

为所有这些数百万甚至数千个类都想出唯一的名称几乎是不可能的。

当然,我们可以想象像A123and之类的名称B345,但如果我们谈论的是选择一个好的类名,一个更容易理解类的名称(例如String字符串),那么即使生成一千个唯一的名称也很多工作的。

这就是为什么在 Java 中习惯使用 package 关键字将类分组到包中。

Java 类及其包非常类似于计算机上的文件和文件夹。

例如,如果您需要在计算机上存储 10 个文档,您可能只需将它们放在一个文件夹中即可。但是,如果您有数千个文档(例如,公司所有文档的存储库)怎么办?

由于要存储数以千计的文档,一种解决方案是创建具有良好描述性名称的多层文件夹。然后在最后一层的文件夹中,存储与该特定文件夹相关的文档。文档的良好描述性名称也没有坏处。

事实上,我们为 Java 中的类做了所有这些。

包含类的文件存储在不同的目录(文件夹)中,类的文件夹及其所有子文件夹的全名就是包的名称。例子:

文件路径 包裹名字 班级名称
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

与文件夹名称不同,包名称使用点作为分隔符。也就是说,文件夹\com\codegym\tasks\对应com.codegym.tasks包。


2.src文件夹

在 Java 中,通常将一个程序的所有类存储在一个文件夹(和子文件夹)中。该文件夹通常称为srcsource的缩写)。

此文件夹称为项目根目录(或源代码根目录),所有包路径都是相对于它的。例子:

文件夹 包裹名字
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

在这种情况下,程序员会说“我们有一个名为 的项目my位于c:\projects\data文件夹中”或“我们有一个名为 的项目project位于d:\files\git\data文件夹中”

最好始终将类放在包中,而不是直接放在根文件夹中 ( src如果你只有几个类,这不会出现问题。但是当有很多类时,很容易混淆。所以, 总是只在包中创建你的类。

在 Java 中,习惯上给类和包起有意义的名字。许多公司发布了他们自己的库(一组类),为了避免混淆,他们将公司/网站/项目的名称合并到包的名称中:

包裹名字 公司/项目名称
org.apache.common
org.apache.tomcat
org.apache.util
阿帕奇项目
com.oracle.jdbc
甲骨文公司
java.io
javax.servlet
Oracle公司,Java项目
com.ibm.websphere
IBM公司,WebSphere项目
com.jboss
JBoss项目

3.文件内容

根据 Java 语言标准,有关类名及其包名的信息必须与代码一起包含在文件中。一般形式如下图所示:

package package-name;

public class ClassName
{

}

包名必须与文件夹名匹配,文件名必须与公共类名匹配。

如果你有一个文件,那么它应该包含这个:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4.导入类

包名构成了所谓的类的完全限定名

例子:

完全合格的名称 包裹名字 班级名称
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
没有任何
Cat

好消息:

完全限定的类名在项目中始终是唯一的。毕竟,您不能在一个文件夹中创建两个同名文件。

坏消息:

完全限定的类名通常很长或很长。而且每次都在代码中写出一个长名称(例如 java.util.ArrayList)非常不方便。

这就是为什么 Java 添加了导入类的能力。

您可以在代码中使用类的短名称,但必须首先让编译器知道哪个类的完全限定名称对应于短名称。如果你现在在你的项目中有多个同名的类怎么办?或者你原来有一个,但后来又增加了 15 个......

要在代码中使用短类名,您需要添加以下结构:

import fully-qualified-class-name;

该声明必须添加在类的最开头,紧跟在package声明之后。

例子:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

我们导入了两个类(java.util.Scannercom.test.helper.special.ArrayList),因此我们可以在代码中使用它们的简称。编译器将知道要使用哪些类。

如果我们没有使用,相同的代码会是这样的import

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

顺便说一下,如果您的项目有两个名为 的类Scanner,您将无法将它们都导入到同一个文件中:您将不得不 为其中一个使用长名称。

假设您的团队中有一位 Jen。没有沟通问题,因为每个人都知道她是谁。但如果有三个 Jens,则必须使用完全限定的名称来区分它们。

注1

顺便说一句,如果你懒得在你的类中添加大量导入语句,你可以使用它的懒惰版本:而不是特定的类名,放一个星号:

import package-name.*;

这将允许您使用包中所有类的短名称。

笔记2

包中的所有类java.lang都是自动导入的,因此您无需import为它们编写声明。您肯定已经知道这些课程之一:java.lang.String. 恩,那就对了。这是String我们用来处理字符串的类。