1. Pakker

Almindelige Java-programmer involverer et enormt antal klasser. Hvor mange? Tusinder, titusinder. Og hvis du også tager højde for, at programmet bruger forskellige biblioteker, der indeholder klasser skrevet af andre programmører, så kan antallet af klasser sagtens måles i millioner!

Det ville være næsten umuligt at finde på unikke navne til alle disse millioner, eller endda bare tusindvis af klasser.

Selvfølgelig kan vi forestille os navne som A123og B345, men hvis vi taler om at vælge et godt klassenavn, et der gør det lettere at forstå klassen (som Stringfor strenge f.eks.), så er det meget at generere tusinde unikke navne. af arbejde.

Derfor er det i Java sædvanligt at gruppere klasser i pakker ved hjælp af pakkenøgleordet.

Java-klasser og deres pakker minder meget om filer og mapper på en computer.

For eksempel, hvis du skal gemme 10 dokumenter på din computer, ville du sandsynligvis bare opbevare dem i én mappe. Men hvad nu hvis du har tusindvis af dokumenter (f.eks. et lager af alle en virksomheds dokumenter)?

Med tusindvis af dokumenter, der skal gemmes, er en løsning at oprette flere niveauer af mapper med gode beskrivende navne. Og gem så i en mappe på det allersidste niveau de dokumenter, der vedrører den pågældende mappe. Gode ​​beskrivende navne til dokumenterne skader heller ikke.

Faktisk gør vi alt dette til klasser i Java.

Filerne, der indeholder klasserne, er gemt i forskellige mapper (mapper), og det fulde navn på klassens mappe med alle dens undermapper er navnet på pakken. Eksempel:

Sti 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 modsætning til mappenavne bruger pakkenavne en prik som afgrænsning. Med andre ord svarer mappen \com\codegym\tasks\til com.codegym.taskspakken.


2. srcmappe

I Java er det sædvanligt at gemme alle klasserne for et program i en enkelt mappe (og undermapper). Denne mappe kaldes normalt src(forkortelse for kilde ).

Denne mappe kaldes projektroden (eller kilderoden ), 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 situation siger programmører noget som "vi har et projekt ved navn my, som er placeret i c:\projects\datamappen" eller "vi har et projekt ved navn project, som er placeret i d:\files\git\datamappen"

Det er bedst altid at lægge klasser i pakker og ikke direkte i rodmappen ( src. Hvis du kun har nogle få klasser, giver det ikke noget problem. Men når der er mange klasser, er det meget nemt at blive forvirret. Så , opret altid kun dine klasser i pakker.

I Java er det sædvanligt at give meningsfulde navne til klasser og pakker. Mange virksomheder frigiver deres egne biblioteker (et sæt klasser), og for at undgå forvirring inkorporerer de navnet på virksomheden/hjemmesiden/projektet i navnet på pakken:

Pakkenavn Firma-/projektnavn
org.apache.common
org.apache.tomcat
org.apache.util
Apache projekt
com.oracle.jdbc
Oracle selskab
java.io
javax.servlet
Oracle-virksomhed, Java-projekt
com.ibm.websphere
IBM-virksomhed, WebSphere-projekt
com.jboss
JBoss projekt

3. Filindhold

I henhold til Java-sprogstandarden skal information om et klassenavn og navnet på dets pakke inkluderes i filen med koden. Den generelle formular er vist nedenfor:

package package-name;

public class ClassName
{

}

Pakkenavnet skal svare til mappenavnet, og filnavnet skal svare til det offentlige klassenavn.

Hvis du har en fil, skal den indeholde dette:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Import af klasser

Klassenavnet og pakkenavnet danner det , der kaldes det fuldt kvalificerede navn på klassen .

Eksempler:

Fuldt kvalificeret 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

Den gode nyhed:

Det fuldt kvalificerede klassenavn er altid unikt i et projekt. Du kan jo ikke oprette to filer med samme navn i en enkelt mappe.

Den dårlige nyhed:

Fuldt kvalificerede klassenavne er normalt enten lange eller meget lange. Og at skrive et langt navn (for eksempel java.util.ArrayList) hver gang i kode er super ubelejligt.

Det er derfor, Java tilføjede muligheden for at importere klasser .

Du kan bruge en klasses korte navn i din kode, men du skal først fortælle compileren, hvilket fuldt kvalificeret klassenavn der svarer til det korte navn . Hvad hvis du nu flere klasser med samme navn i dit projekt? Eller du har oprindeligt en, men så blev der tilføjet 15 mere...

For at bruge et kort klassenavn i din kode, skal du tilføje følgende konstruktion:

import fully-qualified-class-name;

Denne erklæring skal tilføjes helt i begyndelsen af ​​undervisningen, lige efter 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 importerede to klasser ( java.util.Scannerog com.test.helper.special.ArrayList), så vi kan bruge deres korte navne i vores kode. Og compileren vil vide, hvilke klasser der skal bruges.

Og her er, hvordan den samme kode ville se ud, hvis vi ikke havde brugt 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 dit projekt har to klasser med navnet Scanner, vil du ikke være i stand til at importere dem begge til den samme fil: du skal bruge det lange navn til en af ​​dem.

Lad os sige, at du har en Jen på dit hold. Der er ingen kommunikationsproblemer, da alle ved, hvem hun er. Men hvis der var tre Jens, så skulle der bruges fuldt kvalificerede navne til at skelne dem.

Note 1

Forresten, hvis du er for doven til at tilføje masser af importudsagn til din klasse, kan du bruge dens dovne version: i stedet for et specifikt klassenavn, sæt en stjerne:

import package-name.*;

Det vil tillade dig at bruge de korte navne på alle klasserne i pakken.

Note 2

Alle klasser i java.langpakken importeres automatisk, så du behøver ikke at skrive en importerklæring til dem. Du kender helt sikkert allerede en af ​​disse klasser: java.lang.String. Ja det er rigtigt. Dette er den Stringklasse, vi har brugt til at arbejde med strenge.