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我們用來處理字符串的類。