1. Paczki

Zwykłe programy Java obejmują ogromną liczbę klas. Ile? Tysiące, dziesiątki tysięcy. A jeśli weźmiemy pod uwagę fakt, że program korzysta z różnych bibliotek zawierających klasy napisane przez innych programistów, to liczbę klas można śmiało mierzyć w milionach!

Wymyślenie unikalnych nazw dla wszystkich tych milionów, a nawet tysięcy klas byłoby prawie niemożliwe.

Oczywiście możemy sobie wyobrazić nazwy takie jak A123i B345, ale jeśli mówimy o wybraniu dobrej nazwy klasy, takiej, która ułatwia zrozumienie klasy (jak Stringnp. dla stringów), to nawet wygenerowanie tysiąca unikalnych nazw to dużo pracy.

Dlatego w Javie zwyczajowo grupuje się klasy w pakiety za pomocą słowa kluczowego package.

Klasy Java i ich pakiety są bardzo podobne do plików i folderów na komputerze.

Na przykład, jeśli chcesz przechowywać 10 dokumentów na swoim komputerze, prawdopodobnie po prostu trzymasz je w jednym folderze. Ale co, jeśli masz tysiące dokumentów (na przykład repozytorium wszystkich dokumentów firmy)?

W przypadku tysięcy dokumentów, które mają być przechowywane, jednym z rozwiązań jest utworzenie wielu poziomów folderów o dobrze opisowych nazwach. A następnie w folderze na ostatnim poziomie przechowuj dokumenty, które odnoszą się do tego konkretnego folderu. Dobre opisowe nazwy dokumentów też nie zaszkodzą.

W rzeczywistości robimy to wszystko dla klas w Javie.

Pliki zawierające klasy są przechowywane w różnych katalogach (folderach), a pełna nazwa folderu klasy wraz ze wszystkimi jego podfolderami jest nazwą pakietu. Przykład:

Ścieżka do pliku Nazwa pakietu Nazwa klasy
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

W przeciwieństwie do nazw folderów, w nazwach pakietów separatorem jest kropka. Innymi słowy, folder \com\codegym\tasks\odpowiada pakietowi com.codegym.tasks.


2. srcfolder

W Javie zwyczajowo przechowuje się wszystkie klasy programu w jednym folderze (i podfolderach). Ten folder jest zwykle nazywany src(skrót od source ).

Ten folder jest nazywany katalogiem głównym projektu (lub katalogiem źródłowym ), a wszystkie ścieżki do pakietów są względem niego względne. Przykłady:

Lornetka składana Nazwa pakietu
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

W takiej sytuacji programiści mówią coś w stylu „mamy projekt o nazwie my, który znajduje się w c:\projects\datafolderze” lub „mamy projekt o nazwie project, który znajduje się w d:\files\git\datafolderze”

Najlepiej jest zawsze umieszczać klasy w pakietach, a nie bezpośrednio w folderze głównym ( src. Jeśli masz tylko kilka klas, nie stanowi to problemu. Ale gdy jest wiele klas, bardzo łatwo się pogubić. Więc , zawsze twórz swoje zajęcia tylko w pakietach.

W Javie zwyczajem jest nadawanie znaczących nazw klasom i pakietom. Wiele firm wydaje własne biblioteki (zestaw klas) i aby uniknąć nieporozumień, dołącza nazwę firmy/strony internetowej/projektu do nazwy pakietu:

Nazwa pakietu Nazwa firmy/projektu
org.apache.common
org.apache.tomcat
org.apache.util
Projekt Apache'a
com.oracle.jdbc
Firma Oracle
java.io
javax.servlet
Firma Oracle, projekt Java
com.ibm.websphere
Firma IBM, projekt WebSphere
com.jboss
Projekt JBossa

3. Zawartość pliku

Zgodnie ze standardem języka Java w pliku z kodem musi być zawarta informacja o nazwie klasy i nazwie jej pakietu. Ogólny formularz przedstawiono poniżej:

package package-name;

public class ClassName
{

}

Nazwa pakietu musi być zgodna z nazwą folderu, a nazwa pliku musi być zgodna z nazwą klasy publicznej.

Jeśli masz plik, powinien on zawierać to:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importowanie klas

Nazwa klasy i nazwa pakietu tworzą tak zwaną w pełni kwalifikowaną nazwę klasy .

Przykłady:

W pełni kwalifikowana nazwa Nazwa pakietu Nazwa klasy
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
nic
Cat

Dobre wieści:

W pełni kwalifikowana nazwa klasy jest zawsze unikatowa w ramach projektu. W końcu nie można utworzyć dwóch plików o tej samej nazwie w jednym folderze.

Złe wiadomości:

W pełni kwalifikowane nazwy klas są zazwyczaj długie lub bardzo długie. A pisanie długiej nazwy (na przykład java.util.ArrayList) za każdym razem w kodzie jest bardzo niewygodne.

Dlatego Java dodała możliwość importowania klas .

Możesz użyć krótkiej nazwy klasy w swoim kodzie, ale najpierw musisz powiadomić kompilator, która w pełni kwalifikowana nazwa klasy odpowiada krótkiej nazwie . Co jeśli teraz w swoim projekcie masz wiele klas o tej samej nazwie? Lub pierwotnie masz jeden, ale potem dodano 15 kolejnych...

Aby użyć krótkiej nazwy klasy w swoim kodzie, musisz dodać następującą konstrukcję:

import fully-qualified-class-name;

Tę deklarację należy dodać na samym początku zajęć, zaraz po packagedeklaracji.

Przykład:

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

Zaimportowaliśmy dwie klasy ( ijava.util.Scanner ) com.test.helper.special.ArrayList, więc możemy używać ich krótkich nazw w naszym kodzie. A kompilator będzie wiedział, których klas użyć.

A oto jak wyglądałby ten sam kod, gdybyśmy nie użyli 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();
   }
}

Nawiasem mówiąc, jeśli twój projekt ma dwie klasy o nazwach Scanner, nie będziesz mógł zaimportować ich obu do tego samego pliku: będziesz musiał użyć długiej nazwy dla jednej z nich.

Załóżmy, że masz Jen w swoim zespole. Nie ma problemów z komunikacją, ponieważ wszyscy wiedzą, kim ona jest. Ale gdyby było trzech Jenów, to do ich odróżnienia należałoby użyć w pełni kwalifikowanych imion.

Notatka 1

Nawiasem mówiąc, jeśli jesteś zbyt leniwy, aby dodać wiele instrukcji importu do swojej klasy, możesz użyć jej leniwej wersji: zamiast konkretnej nazwy klasy umieść gwiazdkę:

import package-name.*;

To pozwoli ci używać krótkich nazw wszystkich klas w pakiecie.

Uwaga 2

Wszystkie klasy w java.langpakiecie są importowane automatycznie, więc nie musisz pisać importdla nich instrukcji. Na pewno znasz już jedną z tych klas: java.lang.String. Tak to prawda. Jest to Stringklasa, której użyliśmy do pracy z ciągami znaków.