1. 套餐
普通的 Java 程序涉及大量的类。多少?几千,几万。而且,如果您还考虑到该程序使用了包含其他程序员编写的类的各种库,那么类的数量很容易以数百万计!
为所有这些数百万甚至数千个类都想出唯一的名称几乎是不可能的。
当然,我们可以想象像A123
and之类的名称B345
,但如果我们谈论的是选择一个好的类名,一个更容易理解类的名称(例如String
字符串),那么即使生成一千个唯一的名称也很多工作的。
这就是为什么在 Java 中习惯使用 package 关键字将类分组到包中。
Java 类及其包非常类似于计算机上的文件和文件夹。
例如,如果您需要在计算机上存储 10 个文档,您可能只需将它们放在一个文件夹中即可。但是,如果您有数千个文档(例如,公司所有文档的存储库)怎么办?
由于要存储数以千计的文档,一种解决方案是创建具有良好描述性名称的多层文件夹。然后在最后一层的文件夹中,存储与该特定文件夹相关的文档。文档的良好描述性名称也没有坏处。
事实上,我们为 Java 中的类做了所有这些。
包含类的文件存储在不同的目录(文件夹)中,类的文件夹及其所有子文件夹的全名就是包的名称。例子:
文件路径 | 包裹名字 | 班级名称 |
---|---|---|
|
|
|
|
|
|
|
|
|
与文件夹名称不同,包名称使用点作为分隔符。也就是说,文件夹\com\codegym\tasks\
对应com.codegym.tasks
包。
2.src
文件夹
在 Java 中,通常将一个程序的所有类存储在一个文件夹(和子文件夹)中。该文件夹通常称为src
(source的缩写)。
此文件夹称为项目根目录(或源代码根目录),所有包路径都是相对于它的。例子:
文件夹 | 包裹名字 |
---|---|
|
|
|
|
在这种情况下,程序员会说“我们有一个名为 的项目my
位于c:\projects\data
文件夹中”或“我们有一个名为 的项目project
位于d:\files\git\data
文件夹中”
最好始终将类放在包中,而不是直接放在根文件夹中 ( src
。如果你只有几个类,这不会出现问题。但是当有很多类时,很容易混淆。所以, 总是只在包中创建你的类。
在 Java 中,习惯上给类和包起有意义的名字。许多公司发布了他们自己的库(一组类),为了避免混淆,他们将公司/网站/项目的名称合并到包的名称中:
包裹名字 | 公司/项目名称 |
---|---|
|
阿帕奇项目 |
|
甲骨文公司 |
|
Oracle公司,Java项目 |
|
IBM公司,WebSphere项目 |
|
JBoss项目 |
3.文件内容
根据 Java 语言标准,有关类名及其包名的信息必须与代码一起包含在文件中。一般形式如下图所示:
package package-name;
public class ClassName
{
}
包名必须与文件夹名匹配,文件名必须与公共类名匹配。
如果你有一个文件,那么它应该包含这个:...\src\com\project\Service.java
package com.project;
public class Service
{
}
4.导入类
类名和包名构成了所谓的类的完全限定名。
例子:
完全合格的名称 | 包裹名字 | 班级名称 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
没有任何 |
|
好消息:
完全限定的类名在项目中始终是唯一的。毕竟,您不能在一个文件夹中创建两个同名文件。
坏消息:
完全限定的类名通常很长或很长。而且每次都在代码中写出一个长名称(例如 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.Scanner
和com.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,则必须使用完全限定的名称来区分它们。
顺便说一句,如果你懒得在你的类中添加大量导入语句,你可以使用它的懒惰版本:而不是特定的类名,放一个星号:
import package-name.*;
这将允许您使用包中所有类的短名称。
包中的所有类java.lang
都是自动导入的,因此您无需import
为它们编写声明。您肯定已经知道这些课程之一:java.lang.String
. 恩,那就对了。这是String
我们用来处理字符串的类。
GO TO FULL VERSION