1. Pakker

Vanlige Java-programmer involverer et enormt antall klasser. Hvor mange? Tusenvis, titusenvis. Og hvis du også tar hensyn til at programmet bruker ulike biblioteker som inneholder klasser skrevet av andre programmerere, så kan antallet klasser enkelt måles i millioner!

Det ville være alt annet enn umulig å komme opp med unike navn for alle disse millioner, eller til og med bare tusenvis av klasser.

Selvfølgelig kan vi forestille oss navn som A123og B345, men hvis vi snakker om å velge et godt klassenavn, et som gjør det lettere å forstå klassen (som Stringfor strenger, for eksempel), så er det mye å generere tusen unike navn. av arbeid.

Det er derfor i Java er det vanlig å gruppere klasser i pakker ved å bruke pakkenøkkelordet.

Java-klasser og deres pakker ligner veldig på filer og mapper på en datamaskin.

For eksempel, hvis du trenger å lagre 10 dokumenter på datamaskinen din, vil du sannsynligvis bare ha dem i én mappe. Men hva om du har tusenvis av dokumenter (for eksempel et oppbevaringssted for alle et selskaps dokumenter)?

Med tusenvis av dokumenter som skal lagres, er en løsning å lage flere nivåer av mapper med gode beskrivende navn. Og deretter i en mappe på det aller siste nivået, lagre dokumentene som er relatert til den aktuelle mappen. Gode ​​beskrivende navn på dokumentene skader heller ikke.

Faktisk gjør vi alt dette for klasser i Java.

Filene som inneholder klassene er lagret i forskjellige kataloger (mapper), og det fulle navnet på klassens mappe med alle dens undermapper er navnet på pakken. Eksempel:

Banen til filen Pakkenavn Klassenavn
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

I motsetning til mappenavn, bruker pakkenavn en prikk som skilletegn. Med andre ord, mappen \com\codegym\tasks\tilsvarer pakken com.codegym.tasks.


2. srcmappe

I Java er det vanlig å lagre alle klassene for et program i en enkelt mappe (og undermapper). Denne mappen kalles vanligvis src(forkortelse for kilde ).

Denne mappen kalles prosjektroten (eller kilderoten ), og alle pakkestier er relative til den. Eksempler:

Mapper Pakkenavn
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

I denne situasjonen sier programmerere noe sånt som "vi har et prosjekt som heter my, som ligger i c:\projects\datamappen" eller "vi har et prosjekt som heter project, som ligger i d:\files\git\datamappen"

Det er best å alltid legge klasser i pakker og ikke direkte i rotmappen ( . srcHvis du bare har noen få klasser, er ikke dette noe problem. Men når det er mange klasser, er det veldig lett å bli forvirret. Så , lag alltid klassene dine kun i pakker.

I Java er det vanlig å gi meningsfulle navn til klasser og pakker. Mange bedrifter gir ut sine egne biblioteker (et sett med klasser), og for å unngå forvirring inkorporerer de navnet på selskapet/nettstedet/prosjektet i navnet på pakken:

Pakkenavn Bedrifts-/prosjektnavn
org.apache.common
org.apache.tomcat
org.apache.util
Apache-prosjekt
com.oracle.jdbc
Oracle-selskap
java.io
javax.servlet
Oracle-selskap, Java-prosjekt
com.ibm.websphere
IBM-selskap, WebSphere-prosjektet
com.jboss
JBoss-prosjekt

3. Filinnhold

I henhold til Java-språkstandarden må informasjon om et klassenavn og navnet på dens pakke inkluderes i filen med koden. Det generelle skjemaet er vist nedenfor:

package package-name;

public class ClassName
{

}

Pakkenavnet må samsvare med mappenavnet, og filnavnet må samsvare med det offentlige klassenavnet.

Hvis du har en fil, bør den inneholde dette:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importere klasser

Klassenavnet og pakkenavnet danner det som kalles det fullt kvalifiserte navnet klassen .

Eksempler:

Fullt kvalifisert navn Pakkenavn Klassenavn
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
ingen
Cat

De gode nyhetene:

Det fullt kvalifiserte klassenavnet er alltid unikt i et prosjekt. Tross alt kan du ikke lage to filer med samme navn i en enkelt mappe.

Den dårlige nyheten:

Fullt kvalifiserte klassenavn er vanligvis enten lange eller veldig lange. Og å skrive ut et langt navn (for eksempel java.util.ArrayList) hver gang i kode er veldig upraktisk.

Det er derfor Java la til muligheten til å importere klasser .

Du kan bruke en klasses korte navn i koden din, men du må først gi kompilatoren beskjed om hvilket fullt kvalifisert klassenavn som tilsvarer det korte navnet . Hva om du nå har flere klasser med samme navn i prosjektet ditt? Eller du har opprinnelig en, men så ble det lagt til 15 til...

For å bruke et kort klassenavn i koden din, må du legge til følgende konstruksjon:

import fully-qualified-class-name;

Denne erklæringen må legges til helt i begynnelsen av timen, rett etter erklæringen package.

Eksempel:

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

Vi importerte to klasser ( java.util.Scannerog com.test.helper.special.ArrayList), slik at vi kan bruke deres korte navn i koden vår. Og kompilatoren vil vite hvilke klasser som skal brukes.

Og her er hvordan den samme koden ville sett ut hvis vi ikke hadde brukt 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();
   }
}

Forresten, hvis prosjektet ditt har to klasser kalt Scanner, vil du ikke kunne importere begge til samme fil: du må bruke det lange navnet for en av dem.

La oss si at du har en Jen på laget ditt. Det er ingen kommunikasjonsproblemer, siden alle vet hvem hun er. Men hvis det var tre Jens, så måtte fullt kvalifiserte navn brukes for å skille dem.

Merknad 1

Forresten, hvis du er for lat til å legge til mange importsetninger til klassen din, kan du bruke dens late versjonen: i stedet for et spesifikt klassenavn, sett inn en stjerne:

import package-name.*;

Det vil tillate deg å bruke korte navn på alle klassene i pakken.

Notat 2

Alle klasser i java.langpakken importeres automatisk, så du trenger ikke skrive en importerklæring for dem. Du kan garantert allerede en av disse klassene: java.lang.String. Ja, det er riktig. Dette er Stringklassen vi har brukt til å jobbe med strenger.