Core Java: دليل شامل لإتقان الأساسيات
دليل مفصّل للمفاهيم الأساسية في Java، من البنى الأولية إلى البرمجة كائنية التوجه، مع أمثلة عملية لجميع المستويات.
InSkillCoach
Core Java: دليل شامل لإتقان الأساسيات
تُعدّ Java من أكثر لغات البرمجة استخدامًا في العالم، وتحظى بتقدير خاص لقابليتها للنقل ومتانتها ونظامها البيئي الغني. يقدّم لك هذا الدليل المفاهيم الأساسية في Core Java، بدءًا من الأساسيات وصولًا إلى الميزات الأكثر تقدمًا.
مقدمة إلى Java
أنشأ James Gosling لغة Java في شركة Sun Microsystems (التي أصبحت اليوم جزءًا من Oracle)، وأُطلقت عام 1995. وقد أحدثت فلسفتها “Write Once, Run Anywhere” (WORA) ثورة في تطوير البرمجيات.
الخصائص الرئيسية
- كائنية التوجه: كل شيء في Java كائن، باستثناء الأنواع الأولية
- مستقلة عن المنصة: بفضل JVM (Java Virtual Machine)
- متينة: إدارة قوية للأخطاء، وفحص للأنواع أثناء التصريف
- آمنة: تنفيذ داخل بيئة خاضعة للرقابة (sandbox)
- متعددة المسارات (Multi-threading): دعم مدمج للبرمجة المتزامنة
- أداء عالٍ: مصرّف JIT (Just-In-Time) يحسّن التنفيذ
التثبيت والإعداد
تثبيت JDK (Java Development Kit)
# Sur Ubuntu/Debian
sudo apt update
sudo apt install openjdk-17-jdk
# Sur macOS avec Homebrew
brew install openjdk@17
# Sur Windows
# Télécharger depuis https://www.oracle.com/java/technologies/downloads/
إعداد متغيرات البيئة
# Sur Linux/macOS
export JAVA_HOME=/path/to/jdk
export PATH=$PATH:$JAVA_HOME/bin
# Sur Windows
# Définir JAVA_HOME et ajouter %JAVA_HOME%\bin au PATH
الخطوات الأولى مع Java
البنية الأساسية لبرنامج Java
// Fichier: HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
التصريف والتنفيذ
# Compiler
javac HelloWorld.java
# Exécuter
java HelloWorld
أنواع البيانات والمتغيرات
الأنواع الأولية
// Types numériques entiers
byte b = 127; // 8 bits, -128 à 127
short s = 32767; // 16 bits, -32,768 à 32,767
int i = 2147483647; // 32 bits, -2,147,483,648 à 2,147,483,647
long l = 9223372036854775807L; // 64 bits, très grand intervalle
// Types numériques à virgule flottante
float f = 3.14f; // 32 bits
double d = 3.14159; // 64 bits
// Autres types primitifs
char c = 'A'; // 16 bits, caractère Unicode
boolean bool = true; // true ou false
المتغيرات والثوابت
// Déclaration de variable
int nombre;
nombre = 42;
// Déclaration et initialisation
String message = "Bonjour";
// Constantes (final)
final double PI = 3.14159;
العوامل
العوامل الحسابية
int a = 10, b = 3;
int somme = a + b; // 13
int difference = a - b; // 7
int produit = a * b; // 30
int quotient = a / b; // 3 (division entière)
int reste = a % b; // 1 (modulo)
// Incrémentation et décrémentation
a++; // a = a + 1
b--; // b = b - 1
عوامل المقارنة
boolean egal = (a == b); // false
boolean different = (a != b); // true
boolean superieur = (a > b); // true
boolean inferieur = (a < b); // false
boolean supOuEgal = (a >= b); // true
boolean infOuEgal = (a <= b); // false
العوامل المنطقية
boolean x = true, y = false;
boolean et = x && y; // false (AND logique)
boolean ou = x || y; // true (OR logique)
boolean non = !x; // false (NOT logique)
بنى التحكم
الشروط
// If-else
int age = 18;
if (age < 18) {
System.out.println("Mineur");
} else if (age == 18) {
System.out.println("Tout juste majeur");
} else {
System.out.println("Majeur");
}
// Switch
int jour = 3;
switch (jour) {
case 1:
System.out.println("Lundi");
break;
case 2:
System.out.println("Mardi");
break;
case 3:
System.out.println("Mercredi");
break;
// ...
default:
System.out.println("Jour inconnu");
}
// Expression ternaire
String statut = (age >= 18) ? "Majeur" : "Mineur";
الحلقات التكرارية
// Boucle for
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// Boucle while
int compteur = 0;
while (compteur < 5) {
System.out.println(compteur);
compteur++;
}
// Boucle do-while
int j = 0;
do {
System.out.println(j);
j++;
} while (j < 5);
// Boucle for-each (pour les collections)
int[] nombres = {1, 2, 3, 4, 5};
for (int nombre : nombres) {
System.out.println(nombre);
}
المصفوفات والمجموعات (Collections)
المصفوفات
// Déclaration et initialisation d'un tableau
int[] nombres = new int[5];
nombres[0] = 10;
nombres[1] = 20;
// Initialisation avec des valeurs
int[] valeurs = {10, 20, 30, 40, 50};
// Tableau multidimensionnel
int[][] matrice = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Parcourir un tableau
for (int i = 0; i < nombres.length; i++) {
System.out.println(nombres[i]);
}
إطار عمل Collections
import java.util.*;
// Liste
List<String> liste = new ArrayList<>();
liste.add("Pomme");
liste.add("Banane");
liste.add("Orange");
System.out.println(liste.get(1)); // Banane
liste.remove("Pomme");
// Ensemble (éléments uniques)
Set<Integer> ensemble = new HashSet<>();
ensemble.add(1);
ensemble.add(2);
ensemble.add(1); // Ignoré car déjà présent
System.out.println(ensemble.size()); // 2
// Map (clé-valeur)
Map<String, Integer> map = new HashMap<>();
map.put("Pierre", 30);
map.put("Marie", 25);
System.out.println(map.get("Marie")); // 25
البرمجة كائنية التوجه (POO)
الأصناف والكائنات
// Définition d'une classe
public class Personne {
// Attributs (champs)
private String nom;
private int age;
// Constructeur
public Personne(String nom, int age) {
this.nom = nom;
this.age = age;
}
// Méthodes
public void sePresenter() {
System.out.println("Je m'appelle " + nom + " et j'ai " + age + " ans.");
}
// Getters et Setters
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// Utilisation de la classe
Personne personne = new Personne("Alice", 30);
personne.sePresenter();
personne.setAge(31);
System.out.println(personne.getAge()); // 31
الوراثة
// Classe parente
public class Animal {
protected String nom;
public Animal(String nom) {
this.nom = nom;
}
public void manger() {
System.out.println(nom + " mange.");
}
}
// Classe enfant
public class Chien extends Animal {
private String race;
public Chien(String nom, String race) {
super(nom); // Appel du constructeur parent
this.race = race;
}
public void aboyer() {
System.out.println(nom + " aboie.");
}
// Surcharge de méthode
@Override
public void manger() {
System.out.println(nom + " le chien mange des croquettes.");
}
}
// Utilisation
Chien rex = new Chien("Rex", "Berger Allemand");
rex.manger(); // "Rex le chien mange des croquettes."
rex.aboyer(); // "Rex aboie."
تعدد الأشكال (Polymorphisme)
Animal animal1 = new Animal("Truc");
Animal animal2 = new Chien("Médor", "Labrador"); // Polymorphisme
animal1.manger(); // "Truc mange."
animal2.manger(); // "Médor le chien mange des croquettes."
// animal2.aboyer(); // Erreur de compilation, car animal2 est de type Animal
((Chien) animal2).aboyer(); // OK après cast
الواجهات (Interfaces)
// Définition d'une interface
public interface Nageur {
void nager();
}
// Implémentation d'une interface
public class Poisson extends Animal implements Nageur {
public Poisson(String nom) {
super(nom);
}
@Override
public void nager() {
System.out.println(nom + " nage rapidement.");
}
}
// Multiple implémentation
public class Canard extends Animal implements Nageur {
public Canard(String nom) {
super(nom);
}
@Override
public void nager() {
System.out.println(nom + " nage lentement.");
}
}
// Utilisation
Nageur nageur1 = new Poisson("Nemo");
Nageur nageur2 = new Canard("Donald");
nageur1.nager(); // "Nemo nage rapidement."
nageur2.nager(); // "Donald nage lentement."
الأصناف المجرّدة
// Classe abstraite
public abstract class Vehicule {
protected String marque;
public Vehicule(String marque) {
this.marque = marque;
}
// Méthode concrète
public void demarrer() {
System.out.println("Le véhicule démarre.");
}
// Méthode abstraite (à implémenter par les sous-classes)
public abstract void accelerer();
}
// Implémentation d'une classe abstraite
public class Voiture extends Vehicule {
public Voiture(String marque) {
super(marque);
}
@Override
public void accelerer() {
System.out.println("La voiture " + marque + " accélère.");
}
}
معالجة الاستثناءات
Try-catch-finally
try {
// Code susceptible de générer une exception
int resultat = 10 / 0; // Division par zéro
} catch (ArithmeticException e) {
// Gestion de l'exception
System.out.println("Erreur: Division par zéro");
e.printStackTrace();
} finally {
// Code exécuté dans tous les cas
System.out.println("Fin du traitement");
}
الاستثناءات المخصّصة
// Définition d'une exception personnalisée
public class AgeInvalideException extends Exception {
public AgeInvalideException(String message) {
super(message);
}
}
// Utilisation
public class Utilisateur {
private String nom;
private int age;
public void setAge(int age) throws AgeInvalideException {
if (age < 0 || age > 150) {
throw new AgeInvalideException("L'âge doit être compris entre 0 et 150");
}
this.age = age;
}
}
// Gestion de l'exception
Utilisateur utilisateur = new Utilisateur();
try {
utilisateur.setAge(200);
} catch (AgeInvalideException e) {
System.out.println("Erreur: " + e.getMessage());
}
الإدخال/الإخراج (I/O)
قراءة الملفات
import java.io.*;
// try-with-resources pour fermeture automatique
try (BufferedReader reader = new BufferedReader(new FileReader("fichier.txt"))) {
String ligne;
while ((ligne = reader.readLine()) != null) {
System.out.println(ligne);
}
} catch (IOException e) {
e.printStackTrace();
}
كتابة الملفات
try (BufferedWriter writer = new BufferedWriter(new FileWriter("sortie.txt"))) {
writer.write("Ligne 1");
writer.newLine();
writer.write("Ligne 2");
} catch (IOException e) {
e.printStackTrace();
}
تدفقات الإدخال/الإخراج
// Entrée console
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("Entrez votre nom: ");
String nom = scanner.nextLine();
System.out.println("Bonjour, " + nom + "!");
}
// Sortie formatée
System.out.printf("Température: %.1f°C%n", 22.5);
الأنواع العامة (Generics)
// Classe générique
public class Boite<T> {
private T contenu;
public void mettre(T contenu) {
this.contenu = contenu;
}
public T prendre() {
return contenu;
}
}
// Utilisation
Boite<String> boiteTexte = new Boite<>();
boiteTexte.mettre("Hello");
String texte = boiteTexte.prendre();
Boite<Integer> boiteNombre = new Boite<>();
boiteNombre.mettre(42);
int nombre = boiteNombre.prendre();
الدوال العامة
public <T> void afficherTableau(T[] tableau) {
for (T element : tableau) {
System.out.println(element);
}
}
// Utilisation
String[] mots = {"Bonjour", "le", "monde"};
Integer[] nombres = {1, 2, 3, 4, 5};
afficherTableau(mots);
afficherTableau(nombres);
Lambda وStreams (Java 8+)
تعابير Lambda
// Interface fonctionnelle
interface Calculateur {
int calculer(int a, int b);
}
// Approche traditionnelle
Calculateur addition = new Calculateur() {
@Override
public int calculer(int a, int b) {
return a + b;
}
};
// Avec lambda
Calculateur additionLambda = (a, b) -> a + b;
System.out.println(additionLambda.calculer(5, 3)); // 8
// Autres exemples
Runnable tache = () -> System.out.println("Tâche exécutée");
Comparator<String> comparateur = (s1, s2) -> s1.length() - s2.length();
واجهة Stream البرمجية
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
List<String> noms = Arrays.asList("Jean", "Marie", "Pierre", "Sophie");
// Filtrage
List<String> nomsLongs = noms.stream()
.filter(nom -> nom.length() > 4)
.collect(Collectors.toList()); // [Marie, Pierre, Sophie]
// Mapping
List<Integer> longueurs = noms.stream()
.map(String::length)
.collect(Collectors.toList()); // [4, 5, 6, 6]
// Réduction
int somme = noms.stream()
.mapToInt(String::length)
.sum(); // 21
// Autres opérations
boolean tousLongs = noms.stream().allMatch(nom -> nom.length() > 3); // true
String concatenation = noms.stream().collect(Collectors.joining(", ")); // "Jean, Marie, Pierre, Sophie"
تعدد المسارات والتزامن
إنشاء المسارات (Threads)
// Méthode 1: Étendre Thread
class MonThread extends Thread {
@Override
public void run() {
System.out.println("MonThread s'exécute");
}
}
// Méthode 2: Implémenter Runnable
class MaTache implements Runnable {
@Override
public void run() {
System.out.println("MaTache s'exécute");
}
}
// Utilisation
Thread thread1 = new MonThread();
thread1.start();
Thread thread2 = new Thread(new MaTache());
thread2.start();
// Lambda avec Runnable
Thread thread3 = new Thread(() -> {
System.out.println("Tâche lambda s'exécute");
});
thread3.start();
المزامنة
public class Compteur {
private int valeur = 0;
// Méthode synchronisée
public synchronized void incrementer() {
valeur++;
}
// Bloc synchronisé
public void incrementerBloc() {
synchronized(this) {
valeur++;
}
}
public int getValeur() {
return valeur;
}
}
ExecutorService
import java.util.concurrent.*;
// Création d'un pool de threads
ExecutorService executor = Executors.newFixedThreadPool(5);
// Soumettre des tâches
executor.submit(() -> {
System.out.println("Tâche exécutée par " + Thread.currentThread().getName());
});
// Attendre la terminaison de toutes les tâches
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
الخاتمة
تُعد Java لغة قوية ومتعددة الاستخدامات، وتوفر مجموعة واسعة من الميزات لتطوير تطبيقات عالية الجودة. وعند إتقان هذه المفاهيم الأساسية، ستتمكن من:
- إنشاء تطبيقات متكاملة وعالية الأداء
- فهم منظومة Java واستخدامها (Spring وHibernate وغيرها)
- تطوير حلول مؤسسية موثوقة وسهلة الصيانة
- تطبيق معماريات برمجية حديثة
وللمضي قدمًا، استكشف أطر عمل Java الشائعة مثل Spring Boot، والبرمجة التفاعلية (Reactive Programming) باستخدام Project Reactor أو RxJava، وكذلك واجهات برمجة التطبيقات الأحدث مثل الوحدات (modules) (Java 9 وما بعدها) والسجلات (records) (Java 16 وما بعدها).
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش