1. Mga pakete

Ang mga karaniwang programa ng Java ay nagsasangkot ng napakalaking bilang ng mga klase. Ilan? Libu-libo, sampu-sampung libo. At kung isinasaalang-alang mo rin ang katotohanan na ang programa ay gumagamit ng iba't ibang mga aklatan na naglalaman ng mga klase na isinulat ng iba pang mga programmer, kung gayon ang bilang ng mga klase ay madaling masusukat sa milyun-milyon!

Magiging imposibleng makabuo ng mga natatanging pangalan para sa lahat ng milyun-milyong ito, o kahit libu-libo lang, ng mga klase.

Siyempre, maaari nating isipin ang mga pangalan tulad ng A123at B345, ngunit kung pinag-uusapan natin ang tungkol sa pagpili ng isang magandang pangalan ng klase, isa na nagpapadali sa pag-unawa sa klase (tulad ng Stringpara sa mga string, halimbawa), kung gayon kahit na ang pagbuo ng isang libong natatanging pangalan ay marami. ng trabaho.

Iyon ang dahilan kung bakit sa Java ay kaugalian na igrupo ang mga klase sa mga pakete gamit ang keyword ng package.

Ang mga klase ng Java at ang kanilang mga pakete ay halos kapareho sa mga file at folder sa isang computer.

Halimbawa, kung kailangan mong mag-imbak ng 10 dokumento sa iyong computer, malamang na itago mo lang ang mga ito sa isang folder. Ngunit paano kung mayroon kang libu-libong mga dokumento (halimbawa, isang repositoryo ng lahat ng mga dokumento ng kumpanya)?

Sa libu-libong mga dokumento na maiimbak, isang solusyon ay ang paglikha ng maraming antas ng mga folder na may magagandang mapaglarawang pangalan. At pagkatapos ay sa isang folder sa pinakahuling antas, iimbak ang mga dokumentong nauugnay sa partikular na folder na iyon. Ang magagandang mapaglarawang pangalan para sa mga dokumento ay hindi rin masakit.

Sa katunayan, ginagawa namin ang lahat ng ito para sa mga klase sa Java.

Ang mga file na naglalaman ng mga klase ay naka-imbak sa iba't ibang mga direktoryo (mga folder), at ang buong pangalan ng folder ng klase kasama ang lahat ng mga subfolder nito ay ang pangalan ng package. Halimbawa:

Path sa file Pangalan ng package Pangalan ng klase
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Hindi tulad ng mga pangalan ng folder, ang mga pangalan ng package ay gumagamit ng tuldok bilang delimiter. Sa madaling salita, ang folder \com\codegym\tasks\ay tumutugma sa com.codegym.taskspakete.


2. srcfolder

Sa Java, kaugalian na iimbak ang lahat ng mga klase para sa isang programa sa isang folder (at mga subfolder). Ang folder na ito ay karaniwang tinatawag na src(short for source ).

Ang folder na ito ay tinatawag na project root (o source root ), at ang lahat ng mga path ng package ay nauugnay dito. Mga halimbawa:

Mga folder Pangalan ng package
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

Sa sitwasyong ito, may sinasabi ang mga programmer tulad ng "mayroon kaming proyektong pinangalanang my, na matatagpuan sa c:\projects\datafolder" o "mayroon kaming proyektong pinangalanang project, na matatagpuan sa d:\files\git\datafolder"

Pinakamainam na palaging ilagay ang mga klase sa mga pakete at hindi direkta sa root folder ( src. Kung mayroon ka lamang ilang mga klase, hindi ito nagpapakita ng problema. Ngunit kapag maraming klase, napakadaling malito. Kaya , palaging lumikha ng iyong mga klase sa mga pakete lamang.

Sa Java, kaugalian na magbigay ng mga makabuluhang pangalan sa mga klase at pakete. Maraming kumpanya ang naglalabas ng kanilang sariling mga aklatan (isang hanay ng mga klase) at, upang maiwasan ang kalituhan, isinasama nila ang pangalan ng kumpanya/website/proyekto sa pangalan ng package:

Pangalan ng package Pangalan ng kumpanya/proyekto
org.apache.common
org.apache.tomcat
org.apache.util
Proyekto ng Apache
com.oracle.jdbc
kumpanya ng Oracle
java.io
javax.servlet
Oracle kumpanya, proyekto ng Java
com.ibm.websphere
kumpanya ng IBM, proyekto sa WebSphere
com.jboss
Proyekto ng JBoss

3. Mga nilalaman ng file

Ayon sa pamantayan ng wikang Java, ang impormasyon tungkol sa isang pangalan ng klase at ang pangalan ng package nito ay dapat na kasama sa file na may code. Ang pangkalahatang form ay ipinapakita sa ibaba:

package package-name;

public class ClassName
{

}

Dapat tumugma ang pangalan ng package sa pangalan ng folder, at dapat tumugma ang pangalan ng file sa pangalan ng pampublikong klase.

Kung mayroon kang file, dapat itong maglaman ng ganito:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Pag-import ng mga klase

Ang pangalan ng klase at pangalan ng pakete ay bumubuo ng tinatawag na ganap na kwalipikadong pangalan ng klase .

Mga halimbawa:

Ganap na kwalipikadong pangalan Pangalan ng package Pangalan ng klase
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
wala
Cat

Ang magandang balita:

Ang ganap na kwalipikadong pangalan ng klase ay palaging natatangi sa loob ng isang proyekto. Pagkatapos ng lahat, hindi ka makakagawa ng dalawang file na may parehong pangalan sa isang folder.

Ang masamang balita:

Ang mga ganap na kwalipikadong pangalan ng klase ay kadalasang mahaba o napakahaba. At ang pagsusulat ng mahabang pangalan (halimbawa java.util.ArrayList) sa bawat oras sa code ay sobrang hindi maginhawa.

Iyon ang dahilan kung bakit idinagdag ng Java ang kakayahang mag-import ng mga klase .

Maaari mong gamitin ang maikling pangalan ng isang klase sa iyong code, ngunit dapat mo munang ipaalam sa compiler kung aling ganap na kwalipikadong pangalan ng klase ang tumutugma sa maikling pangalan . Paano kung marami ka na ngayong klase na may parehong pangalan sa iyong proyekto? O orihinal na mayroon kang isa, ngunit pagkatapos ay 15 pa ang idinagdag...

Upang gumamit ng maikling pangalan ng klase sa iyong code, kailangan mong idagdag ang sumusunod na konstruksyon:

import fully-qualified-class-name;

Ang deklarasyon na ito ay dapat idagdag sa pinakasimula ng klase, pagkatapos mismo ng packagedeklarasyon.

Halimbawa:

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();
   }
}

Nag-import kami ng dalawang klase ( java.util.Scannerat com.test.helper.special.ArrayList), para magamit namin ang kanilang maiikling pangalan sa aming code. At malalaman ng compiler kung aling mga klase ang gagamitin.

At narito ang magiging hitsura ng parehong code kung hindi namin ginamit 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();
   }
}

Sa pamamagitan ng paraan, kung ang iyong proyekto ay may dalawang klase na pinangalanang Scanner, hindi mo magagawang i-import ang pareho ng mga ito sa parehong file: kakailanganin mong gamitin ang mahabang pangalan para sa isa sa kanila.

Sabihin nating mayroon kang Jen sa iyong koponan. Walang mga problema sa komunikasyon, dahil alam ng lahat kung sino siya. Ngunit kung mayroong tatlong Jen, kung gayon ang mga ganap na kwalipikadong pangalan ay kailangang gamitin upang makilala ang mga ito.

Tandaan 1

Siyanga pala, kung tinatamad kang magdagdag ng maraming pahayag sa pag-import sa iyong klase, maaari mong gamitin ang tamad na bersyon nito: sa halip na isang partikular na pangalan ng klase, maglagay ng asterisk:

import package-name.*;

Papayagan ka nitong gamitin ang mga maikling pangalan ng lahat ng mga klase sa package.

Tandaan 2

Ang lahat ng mga klase sa java.langpackage ay awtomatikong na-import, kaya hindi mo kailangang magsulat ng isang importpahayag para sa kanila. Tiyak na alam mo na ang isa sa mga klase na ito: java.lang.String. Oo, tama iyan. Ito ang Stringklase na ginamit namin para sa pagtatrabaho sa mga string.