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