1. src qovluğu — kodunuzun yerləşdiyi yer
Əgər Java layihəsi bir ev olsaydı, src qovluğu — əsas sakinlərin (siniflərinizin) toplandığı rahat bir qonaq otağı olardı. Məhz buraya bütün mənbə kod faylları yerləşdirilir, layihənin kökünə, sazlama qovluğuna və ya iş masasına yox (hətta çox istəsəniz belə).
Niyə mənbə fayllarını digər hər şeydən ayırmaq lazımdır?
srcqovluğunda yalnız özünüz yazdığınız fayllar saxlanılır: .java.- Yığım (məsələn, .class faylları, müvəqqəti fayllar) zamanı yaranan hər şey digər qovluqlara yığılır (out, build, target və s.).
- Bu, naviqasiyanı asanlaşdırır, layihəni daha səliqəli edir və IDE-ni daha “xoşbəxt” edir.
Sadə layihə strukturunun nümunəsi:
MyFirstProject/
├── .idea/ # IntelliJ IDEA üçün xidməti fayllar, toxunmuruq
├── out/ # burada kompilyasiya olunmuş .class faylları yaranır
├── src/ # məhz burada sizin mənbə kodunuz “yaşayır”!
│ └── Main.java
├── MyFirstProject.iml
└── README.md
Vacibdir:
Özünüz yazdığınız hər şey — siniflər, paketlər, interfeyslər — src qovluğunda olmalıdır. Oraya şəkillər, musiqilər və gizli reseptlər qoymayın — bunun üçün başqa qovluqlar var.
2. Paketlər package
Java-da sinifləri “paketlərə” qruplaşdırmaq qəbul edilib — bu, fayl sistemindəki qovluqlar kimidir, amma siniflər üçün. Paketlər kömək edir:
- Ad toqquşmalarının qarşısını almağa: layihədə iki
Mainsinfi varsa — müxtəlif paketlərdə olduqda bir-birinə mane olmayacaqlar. - Kodu məntiqi şəkildə strukturlamağa (məsələn,
com.codegym.tasks,com.mycompany.utils). - Siniflərə və metodlara girişə nəzarət etməyə.
Paketin elan sintaksisi
Hər Java faylının əvvəlində (bütün import və class ifadələrindən əvvəl) bu sətir yazılır:
package com.codegym.lesson05;
Bu o deməkdir: bu fayldakı sinif com.codegym.lesson05 paketinə aiddir.
Vacibdir:
Fayl sistemindəki qovluqlar paket adı ilə üst-üstə düşməlidir! Əgər sizdə package com.codegym.lesson05; yazılıbsa, fayla yol belə olacaq:
src/com/codegym/lesson05/Main.java
IntelliJ IDEA-da paket necə yaradılır
- Layihə panelində
srcqovluğuna siçanın sağ düyməsi ilə klikləyin. - New → Package seçin.
- Məsələn, bu adı daxil edin: com.codegym.lesson05 (IDE özü iç-içə qovluqları yaradacaq).
- İndi bu paket daxilində yeni sinif yaradın. com.codegym.lesson05 qovluğuna sağ düymə ilə klikləyin və New → Java Class seçin. Və adı daxil edin
Nümunə:
src/
└── com/
└── codegym/
└── lesson05/
└── User.java
Niyə hər şeyi sadəcə src qovluğuna yığmaq olmaz?
Bütün sinifləri qarışıq halda qoysanız, layihə tez bir zamanda “zibilxanaya” çevriləcək və lazım olan faylı tapmaq tələbə yataqxanasında noutbuk üçün şarj tapmaqdan da çətin olacaq. Paketlərdən istifadə edin — bu, layihəni genişləndirməyi, üçüncü tərəf kitabxanaları qoşmağı və kodu müxtəlif komandalar arasında bölməyi asanlaşdırır.
3. Sinfin tam adı
Java-da hər bir sinif mütləq hansısa bir paketdə yerləşir. Paket sadəcə sinif kitabxanasının içində “qovluq”dur. Məsələn:
- System sinfi java.lang paketindədir. Onun tam adı — java.lang.System.
- Scanner sinfi java.util paketindədir. Onun tam adı — java.util.Scanner.
- ArrayList də java.util paketindədir, ona görə tam adı — java.util.ArrayList.
Yəni sinfin tam adı = paket adı + nöqtə + sinif adı.
Gəlin bunu kodda tətbiq edək:
java.util.Scanner sc = new java.util.Scanner(System.in);
String name = sc.nextLine();
System.out.println("Salam, " + name);
Burada biz açıq şəkildə java.util.Scanner yazırıq. Proqramda Scanner adlı başqa siniflər olsa belə, kompilyator konkret hansı sinfin nəzərdə tutulduğunu anlayır.
Bu çox vacibdir: sinifin adı eyni ola bilər, amma tam adı həmişə unikal olur.
Ümumiyyətlə, niyə tam ad lazımdır?
Tutaq ki, bizdə iki fərqli Date sinfi var:
- java.util.Date (tarixlə işləmək üçün köhnə sinif),
- java.sql.Date (məlumat bazaları ilə işləmək üçün tarix).
Sadəcə belə yazsanız:
Date d = new Date();
Kompilyator hansı Date sinfini istifadə etmək istədiyinizi anlamayacaq. Amma tam adı yazsanız:
java.util.Date d1 = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());
— qarışıqlıq olmayacaq.
4. import operatoru
Hər dəfə sinfin tam adını yazmaq əlverişli deyil. Məhz buna görə Java-da import operatoru mövcuddur.
Əgər belə yazırıq:
import java.util.Scanner;
Bu o deməkdir: “Bu proqramda Scanner sinfini java.util paketindən istifadə edəcəyəm”. Bundan sonra sadəcə belə yaza bilərik:
Scanner sc = new Scanner(System.in);
və kompilyator söhbətin məhz java.util.Scanner-dən getdiyini anlayacaq.
Adi import (bir sinif)
Bu ən geniş yayılmış seçimdir. Konkret sinfi göstəririk:
import java.util.Scanner;
import java.util.ArrayList;
İndi qısa adlarla yaza bilərsiniz: Scanner, ArrayList.
Bütün paketi import etmək *
Bəzən proqramda eyni paketdən çoxlu siniflər istifadə olunur. O zaman belə yazmaq olar:
import java.util.*;
Bu o deməkdir: “java.util paketindəki bütün sinifləri tam adı göstərmədən istifadə etməyə icazə ver”.
İndi belə yaza bilərsiniz:
Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();
Amma yadda saxlayın: import java.util.*; yalnız java.util paketindəki sinifləri import edir, alt paketləri isə etmir. Məsələn, java.util.concurrent.ConcurrentHashMap bura daxil olmur. Onu ayrıca import etmək lazımdır.
import ilə nə etmək olmaz
importmetod daxilində istifadə edilə bilməz — o, yalnız faylın əvvəlində yazılır.importsinifləri yaddaşa yükləmir. O, sadəcə kompilyatora sinfi haradan götürməli olduğunu deyir.importeyni adlı iki sinif olduqda tam adı əvəz edə bilməz.
5. Classpath — Java siniflərinizi necə axtarır
Classpath — Java proqramı işə düşəndə siniflərinizi axtardığı “marşrut”dur. Bunu Java-nın lazım olan .class fayllarını (sizin .java fayllarınızın kompilyasiya olunmuş versiyaları) axtaracağı qovluqlar siyahısı kimi təsəvvür etmək olar.
Susmaya görə IDE özü src qovluğunu (və ya kompilyasiya olunmuş siniflərin olduğu qovluğu, məsələn, out/production/ProjectName) classpath-ə əlavə edir. Yəni əgər siz sinfi com.codegym.lesson05 paketində yazmısınızsa, Java onu bu yolla axtaracaq:
out/production/ProjectName/com/javarush/lesson05/Main.class
IntelliJ IDEA-da classpath necə işləyir?
- Proqramı IDE vasitəsilə işə saldığınızda, o, lazım olan classpath-i avtomatik təyin edir.
- Proqramı komanda sətirindən işə salırsınızsa, -cp və ya -classpath flag-ı ilə classpath-i açıq şəkildə göstərməlisiniz.
- Layihənizdəki və qoşulmuş kitabxanalardakı bütün siniflər classpath-də göstərilən qovluqlarda olmalıdır.
6. Layihədə kodun təşkil edilməsi
Bir sinif — bir fayl
Java-da qəbul olunub ki, hər bir public sinif ayrı bir faylda olsun və faylın adı sinfin adı ilə eyni olsun. Məsələn, əgər sizin sinfiniz Persondirsə, faylın adı Person.java olmalıdır.
Nümunə:
src/com/javarush/lesson05/Person.java
package com.codegym.lesson05;
public class Person {
String name;
}
Fayl adları və sinif adları üst-üstə düşməlidir
Əgər sinfin adı MySuperClassdırsa, faylın adı MySuperClass.java olmalıdır. Bu sadəcə həvəs deyil, Java kompilyatorunun tələbidir. Əgər səhv etsəniz — kompilyasiya mərhələsində xəta alacaqsınız.
Resursları (şəkillər, mətn faylları) harada saxlamaq olar?
- Resurslar üçün adətən ayrıca qovluq yaradılır, məsələn, resources və ya res.
- IntelliJ IDEA-da belə qovluğu qovluğa sağ düymə ilə klikləyib əlavə edə bilərsiniz: Mark Directory as → Resources Root.
- Java kodu bu fayllara
classpathvasitəsilə müraciət edə bilər.
Struktur nümunəsi:
MyFirstProject/
├── src/
│ └── com/javarush/lesson05/
│ └── Main.java
├── resources/
│ └── config.txt
8. Layihə strukturuyla işləyərkən tipik səhvlər
Qovluq strukturu ilə paket adının uyğun gəlməməsi
Əgər faylın əvvəlində package com.codegym.lesson05; yazılıbsa, amma fayl src/Main.java içindədirsə, kompilyator "package does not exist" və ya "class not found" xətası verəcək. Həmişə qovluqların paket adına uyğun olduğuna diqqət edin!
Faylın adı ilə sinfin adının uyğun gəlməməsi
Əgər sinfin adı Persondırsa, amma faylın adı — People.javadırsa, "class Person is public, should be declared in a file named Person.java" alacaqsınız.
Paket sətrini yeniləmədən faylları əl ilə köçürmək
Əgər faylı başqa qovluğa köçürmüsünüzsə, amma package sətrini dəyişməyi unutmusanız, proqram kompilyasiya olunmayacaq. Bunu IDE-də Project pəncərəsində edin — o, package-i özü yeniləyəcək!
Resurslar classpath-ə əlavə edilməyib
Əgər faylları (məsələn, mətn faylları) resources qovluğundan kənarda saxlayırsınız və qovluğu Resources Root kimi işarələməmisinizsə, proqram onları classpath vasitəsilə tapa bilməyəcək.
GO TO FULL VERSION