1. Пакети

Обикновените Java програми включват огромен брой класове. Колко? Хиляди, десетки хиляди. И ако вземете предвид и факта, че програмата използва различни библиотеки, съдържащи класове, написани от други програмисти, тогава броят на класовете може лесно да се измери в мorони!

Би било почти невъзможно да се измислят уникални имена за всички тези мorони or дори само хиляди класове.

Разбира се, можем да си представим имена като A123и B345, но ако говорим за избор на добро име на клас, такова, което улеснява разбирането на класа (като Stringза низове, например), тогава дори генерирането на хиляда уникални имена е много на работа.

Ето защо в Java е обичайно класовете да се групират в пакети с помощта на ключовата дума package.

Java класовете и техните пакети са много подобни на файлове и папки на компютър.

Например, ако трябва да съхраните 10 documentа на вашия компютър, вероятно просто ще ги държите в една папка. Но Howво ще стане, ако имате хиляди documentи (например хранorще на всички documentи на фирма)?

С хиляди documentи, които трябва да се съхраняват, едно решение е да се създадат множество нива на папки с добри описателни имена. И след това в папка на последното ниво съхранете documentите, които се отнасят до тази конкретна папка. Добрите описателни имена за documentите също не вредят.

Всъщност ние правим всичко това за класове в Java.

Файловете, съдържащи класовете, се съхраняват в различни директории (папки), а пълното име на папката на класа с всичките му подпапки е името на пакета. Пример:

Път до file Име на пакета Име на класа
\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 е обичайно да се съхраняват всички класове за програма в една папка (и подпапки). Тази папка обикновено се нарича src(съкратено от източник ).

Тази папка се нарича корен на проекта (or корен на източника ) и всички пътища на пакета са относителни към него. Примери:

Папки Име на пакета
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папката“ or „имаме проект с име project, който се намира в d:\files\git\dataпапката“

Най-добре е винаги да поставяте класове в пакети, а не директно в главната папка ( src. Ако имате само няколко класа, това не представлява проблем. Но когато има много класове, е много лесно да се объркате. Така че , винаги създавайте вашите класове само в пакети.

В Java е обичайно да се дават смислени имена на класове и пакети. Много компании пускат свои собствени библиотеки (набор от класове) и, за да избегнат объркване, те включват името на компанията/уебсайта/проекта в името на пакета:

Име на пакета Име на фирма/проект
org.apache.common
org.apache.tomcat
org.apache.util
Проект Apache
com.oracle.jdbc
Компания Oracle
java.io
javax.servlet
Компания Oracle, Java проект
com.ibm.websphere
Компания IBM, проект WebSphere
com.jboss
Проект JBoss

3. Съдържание на file

Съгласно езиковия стандарт Java във file с codeа трябва да бъде включена информация за името на класа и името на неговия пакет. Общият формуляр е показан по-долу:

package package-name;

public class ClassName
{

}

Името на пакета трябва да съвпада с името на папката, а името на file трябва да съвпада с името на публичния клас.

Ако имате файл, той трябва да съдържа това:...\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

Добрата новина:

Напълно квалифицираното име на клас винаги е уникално в рамките на проекта. В крайна сметка не можете да създадете два file с едно и също име в една папка.

Лошата новина:

Напълно квалифицираните имена на класове обикновено са дълги or много дълги. И изписването на дълго име (например java.util.ArrayList) всеки път в codeа е супер неудобно.

Ето защо Java добави възможността за импортиране на класове .

Можете да използвате кратко име на клас във вашия code, но първо трябва да уведомите компилатора кое пълно име на клас съответства на краткото име . Ами ако сега имате множество класове с едно и също име във вашия проект? Или първоначално имате един, но след това са добавени още 15...

За да използвате кратко име на клас във вашия code, трябва да добавите следната конструкция:

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

Импортирахме два класа ( и ), така че можем да използваме техните кратки имена в нашия code . И компилаторът ще знае кои класове да използва.java.util.Scannercom.test.helper.special.ArrayList

И ето How би изглеждал същият code, ако не бяхме използвали 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, няма да можете да импортирате и двата в един и същи файл: ще трябва да използвате дългото име за един от тях.

Да приемем, че имате Джен в екипа си. Няма проблеми с комуникацията, тъй като всички знаят коя е тя. Но ако имаше три Jens, тогава трябваше да се използват напълно квалифицирани имена, за да се разграничат.

Бележка 1

Между другото, ако сте твърде мързеливи, за да добавите много оператори за импортиране към вашия клас, можете да използвате неговата мързелива version: instead of конкретно име на клас, поставете звездичка:

import package-name.*;

Това ще ви позволи да използвате кратките имена на всички класове в пакета.

Бележка 2

Всички класове в java.langпакета се импортират автоматично, така че не е необходимо да пишете importизявление за тях. Със сигурност вече знаете един от тези класове: java.lang.String. Да, така е. Това е Stringкласът, който сме използвали за работа с низове.