1. Csomagok

A hagyományos Java programok rendkívül sok osztályt foglalnak magukban. Mennyi? Ezrek, tízezrek. És ha azt is figyelembe veszed, hogy a program különféle, más programozók által írt osztályokat tartalmazó könyvtárakat használ, akkor az osztályok száma könnyen milliókban mérhető!

Lehetetlen lenne egyedi nevet kitalálni ennek a milliónyi vagy akár több ezer osztálynak.

Természetesen el tudunk képzelni olyan neveket, mint A123és B345, de ha jó osztálynév kiválasztásáról beszélünk, olyat, amely megkönnyíti az osztály megértését (például a Stringkarakterláncoknál), akkor ezer egyedi név generálása is sok. munkában.

Éppen ezért a Java-ban szokás az osztályokat csomagokba csoportosítani a package kulcsszó használatával.

A Java osztályok és csomagjaik nagyon hasonlítanak a számítógépen lévő fájlokhoz és mappákhoz.

Például, ha 10 dokumentumot kell tárolnia a számítógépén, valószínűleg csak egy mappában tárolja őket. De mi van akkor, ha több ezer dokumentummal rendelkezik (például egy vállalat összes dokumentumának tárháza)?

Mivel több ezer dokumentumot kell tárolni, az egyik megoldás az, ha többszintű mappát hoz létre jó leíró névvel. Majd a legutolsó szinten lévő mappában tárolja az adott mappához kapcsolódó dokumentumokat. Az iratok jó leíró elnevezése sem árt.

Valójában mindezt Java nyelvű osztályokhoz tesszük.

Az osztályokat tartalmazó fájlok különböző könyvtárakban (mappákban) vannak tárolva, és az osztály mappájának teljes neve az összes almappájával együtt a csomag neve. Példa:

A fájl elérési útja Csomag név Osztály név
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

A mappanevektől eltérően a csomagnevek pontokat használnak elválasztóként. Más szóval, a mappa \com\codegym\tasks\megfelel a com.codegym.taskscsomagnak.


2. srcmappa

A Java-ban bevett szokás, hogy egy program összes osztályát egyetlen mappában (és almappákban) tárolják. Ezt a mappát általában hívják ( a forrássrc rövidítése ).

Ezt a mappát projektgyökérnek (vagy forrásgyökérnek ) nevezik, és minden csomag elérési útja relatív hozzá. Példák:

Mappák Csomag név
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

Ebben a helyzetben a programozók valami ilyesmit mondanak: "van egy projektünk my, amely a mappában található c:\projects\data" vagy "van egy projektünk project, amely a mappában található d:\files\git\data"

A legjobb, ha az osztályokat mindig csomagokba helyezi, és nem közvetlenül a gyökérmappába ( src. Ha csak néhány osztálya van, ez nem jelent problémát. De ha sok osztály van, nagyon könnyen összezavarodhatunk. Tehát , mindig csak csomagokban hozza létre az osztályait.

A Java nyelven az osztályoknak és csomagoknak értelmes neveket szokás adni. Sok vállalat kiadja saját könyvtárát (osztályok csoportját), és a félreértések elkerülése végett beépíti a cég/webhely/projekt nevét a csomag nevébe:

Csomag név Vállalat/projekt neve
org.apache.common
org.apache.tomcat
org.apache.util
Apache projekt
com.oracle.jdbc
Oracle cég
java.io
javax.servlet
Oracle cég, Java projekt
com.ibm.websphere
IBM cég, WebSphere projekt
com.jboss
JBoss projekt

3. Fájl tartalma

A Java nyelvi szabvány szerint a kóddal együtt a fájlban szerepelnie kell egy osztálynévnek és a csomag nevének. Az általános forma az alábbiakban látható:

package package-name;

public class ClassName
{

}

A csomag nevének meg kell egyeznie a mappa nevével, a fájl nevének pedig meg kell egyeznie a nyilvános osztály nevével.

Ha van fájlja , akkor a következőt kell tartalmaznia:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Osztályok importálása

Az osztálynév és a csomagnév alkotja az osztály teljes képzésű nevét .

Példák:

Teljesen minősített név Csomag név Osztály név
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
egyik sem
Cat

A jó hírek:

A teljesen minősített osztálynév mindig egyedi a projekten belül. Végül is nem hozhat létre két azonos nevű fájlt egy mappában.

A rossz hír:

A teljesen minősített osztálynevek általában hosszúak vagy nagyon hosszúak. És nagyon kényelmetlen minden alkalommal kiírni egy hosszú nevet (például java.util.ArrayList) a kódba.

Ezért a Java hozzáadta az osztályok importálásának lehetőségét .

Használhatja egy osztály rövid nevét a kódban, de először tudatnia kell a fordítóval, hogy melyik teljes képzésű osztálynév felel meg a rövid névnek . Mi van, ha most több azonos nevű osztályt vesz a projektben? Vagy eredetileg van egy, de aztán hozzáadtak még 15-öt...

Ha rövid osztálynevet szeretne használni a kódban, hozzá kell adnia a következő konstrukciót:

import fully-qualified-class-name;

Ezt a deklarációt az óra legelejére, közvetlenül a packagedeklaráció után kell hozzáadni.

Példa:

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

Két osztályt ( és ) importáltunk , így ezek rövid nevét használhatjuk a kódunkban . A fordító pedig tudni fogja, hogy mely osztályokat használja.java.util.Scannercom.test.helper.special.ArrayList

És így nézne ki ugyanaz a kód, ha nem használtuk volna 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();
   }
}

Egyébként, ha a projektnek két osztálya van Scanner, akkor nem tudja mindkettőt ugyanabba a fájlba importálni: az egyiknek a hosszú nevet kell használnia .

Tegyük fel, hogy van egy Jen a csapatodban. Nincsenek kommunikációs problémák, hiszen mindenki tudja, ki ő. De ha három Jenő lenne, akkor teljesen minősített neveket kellene használni megkülönböztetésükhöz.

1. megjegyzés

Egyébként, ha túl lusta ahhoz, hogy sok import utasítást adjon az osztályához, használhatja a laza verzióját: egy adott osztálynév helyett tegyen egy csillagot:

import package-name.*;

Ez lehetővé teszi a csomagban lévő összes osztály rövid nevének használatát .

Jegyzet 2

A csomagban lévő összes osztály java.langautomatikusan importálva van, így nem kell importhozzájuk utasítást írni. Biztosan ismeri az alábbi osztályok egyikét: java.lang.String. Igen ez így van. Ez az az Stringosztály, amelyet a karakterláncokkal való munkához használtunk.