📘 شرح الدرس الوحدة 5: البرمجة الشيئية · الدرس 12 من 17
الدرس 12
📋 في الخطة: الوحدة 9. إنشاء واستخدام الكائنات والصفوف

إنشاء الكائنات والصفوف

دالة خاصة تُستدعى تلقائيًّا لحظة إنشاء الكائن، لتعطي خصائصه قيمها الأولى.

new Book(2, …) bk2 : Book id = 2title = "Learn Javan"author = "Fahad"price = 11.67 …
بعد هذا الدرس ستستطيع أن:
  • تنشئ كلاسًا بخصائص ودوال، وتنشئ منه كائنات.
  • تكتب دالة البناء constructor بمعاملات وبدونها.
  • تخفي الخصائص بـ private وتصل إليها عبر get و set.
  • تجمع البيانات والوظائف المترابطة في كلاس واحد.

١دالة البناء constructor

دالة خاصة تُستخدم لتهيئة الكائنات، وتُستدعى تلقائيًّا عند إنشاء كائن: Book bk1 = new Book();
الشرطالتوضيح
الاسممطابق لاسم الكلاس
النوع الراجعلا يُكتب أي نوع، ولا حتى void
إذا لم تكتبهاكل الكلاسات فيها دالة بناء افتراضية، لكن بلا عمل إضافي
package library; public class Main {     public static void main(String[] args) {        Book bk1 = new Book();    }}
package library; public class Book {    // constructor    // دالة البناء    public Book() {    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
MainBook
Main+ main(args : String[]) : voidBook+ Book()

٢دالة بناء بمعاملات

تستقبل معاملات تُستخدم لتهيئة خصائص الكائن عند إنشائه: Book bk2 = new Book(2, "Learn Javan", "Fahad", 11.67,237);

public Book(int id, …) this.id= id; id‏ ← ‏المعامل (القيمة 2) bk2 : Book id = 2title = "Learn Javan"
this.id = خاصية الكائن الذي يُنشأ الآن، و id وحدها = المعامل. بدون this يُسند المعامل إلى نفسه وتبقى الخاصية فارغة.

٣الوصول إلى خصائص الكلاس

بعد إنشاء الكائن نصل إلى خصائصه بصيغة النقطة (.)، فنقرأ قيمتها أو نعدّلها. وفي NetBeans تظهر قائمة الخصائص تلقائيًّا بعد كتابة bk1.

«create»Book~ id : int~ title : String~ author : String~ price : double~ pages : int+ Book()+ Book(id, title, author, price, pages)Main+ main(args : String[]) : void
🧩 دالتا البناء في قسم الدوال باسم الكلاس نفسه وبلا نوع راجع. والسهم المتقطع: Main تستخدم Book وتنشئ منه الكائنين bk1 و bk2.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract
package library;public class Main {    public static void main(String[] args) {        Book bk1 = new Book();        System.out.println("id: " + bk1.id);        System.out.println("title: " + bk1.title);        bk1.id = 1;        bk1.title = "Java in 10 days";        bk1.author = "Ali";        bk1.price = 54.99;        bk1.pages = 416;        System.out.println("id: " + bk1.id);        System.out.println("title: " + bk1.title);        System.out.println("-------------------");         Book bk2 = new Book(2, "Learn Javan", "Fahad",                            11.67,237);         System.out.println("id: " + bk2.id);        System.out.println("title: " + bk2.title);    }}
package library;public class Book {    //Attributes | Fields | Data Members الخصائص    int id;    String title;    String author;    double price;    int pages;    //دالة بناء    public Book() {    }    // دالة بناء ثانية    public Book(int id, String title, String author,                double price, int pages) {        this.id = id;        this.title = title;        this.author = author;        this.price = price;        this.pages = pages;    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
MainBook
Main+ main(args : String[]) : voidBook~ id : int~ title : String~ author : String~ price : double~ pages : int+ Book()+ Book(id : int, title : String, author : String, price : double, pages : int)

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – Library (run)×
run:
id: 0
title: null
id: 1
title: Java in 10 days
-------------------
id: 2
title: Learn Javan
BUILD SUCCESSFUL (total time: 0 seconds)

قبل إعطاء bk1 قيمًا طُبعت القيم الافتراضية: 0 للعدد و null للنص.

٤وظائف الكلاس methods

الدوال تمثّل أفعال الكلاس، وتُعرَّف داخله، وتُستدعى عن طريق كائن معيّن فتعمل على خصائصه هو دون غيره. نضيف إلى Book الدالة printBookDetails() ونستدعيها لكل كتاب، وهذا هو التدريب العملي 5 التالي.

٥ما هو التغليف؟

إخفاء بيانات الكائن ومنع قراءتها أو تعديلها مباشرة، مع إتاحة التعامل معها بشروط عبر دوال عامة. فكرته: إخفاء من جهة، وإتاحة مضبوطة من جهة أخرى.

خطوتان لتطبيقه

تغليفUser+ username : String+ password : StringUser - username : String- password : String+ getUsername() : String+ setUsername(u : String) : void+ getPassword() : String+ setPassword(p : String) : void
🧩 قبل: خصائص public يغيّرها أي أحد بأي قيمة. بعد: خصائص private (−) لا يصل إليها إلا الكلاس، ودوال public (+) تفرض الشروط.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract

٦بدون تغليف: لا حماية

package user;public class User {    public String username;    public String password;}
package main;import user.User;public class Main {    public static void main(String[] args) {        User user1 = new User();        user1.username = "123";        user1.password = "123";    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
UserMain
User+ username : String+ password : StringMain+ main(args : String[]) : void

بهذه الطريقة لا قيود على username ولا password، فيمكن إسناد أي قيمة نصية لهما مباشرة.

٧مع التغليف: شروط عند الإدخال

package lab10;public class User {    private String username;    private String password;     public String getUsername() {        return username;    }     public void setUsername(String username) {        if (username.contains("=")) {            System.out.println("Error: username cannot "                    + "contain an equals sign (=)");        } else {            this.username = username;        }    }     public String getPassword() {        return password;    }     public void setPassword(String password) {        if (password.length() >= 6 && password.length() < 30) {            this.password = password;        } else {            System.out.println("Error: password must be "                    + "6-30 characters long");        }    }}
package lab10;public class Main {    public static void main(String[] args) {        User user1 = new User();        user1.setUsername("abc=856");        user1.setPassword("a123b");        System.out.println("username: " + user1.getUsername());        System.out.println("password: " + user1.getPassword());         User user2 = new User();        user2.setUsername("med88");        user2.setPassword("tu88tu");         System.out.println("username: " + user2.getUsername());        System.out.println("password: " + user2.getPassword());    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
UserMain
User- username : String- password : String+ getUsername() : String+ setUsername(username : String) : void+ getPassword() : String+ setPassword(password : String) : voidMain+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – lab10 (run)×
run:
Error: username cannot contain an equals sign (=)
Error: password must be 6-30 characters long
username: null
password: null
username: med88
password: tu88tu
BUILD SUCCESSFUL (total time: 0 seconds)

user1 لم يحقق الشرطين، فرُفضت القيمتان وبقيتا null. أما user2 فقُبل.

التوليد التلقائي في NetBeans

بدل كتابة دوال get و set يدويًّا، يولّدها NetBeans لك:

  1. انقر بالزر الأيمن داخل الكلاس User، واختر Insert Code (أو اضغط Alt+Insert).
قائمة الزر الأيمن وفيها Insert Code
الزر الأيمن داخل الكلاس‏ ← ‏Insert Code
  1. من قائمة Generate اختر Getter and Setter.
قائمة Generate في NetBeans
قائمة Generate‏ ← ‏Getter and Setter
  1. حدّد الخصائص password و username، وفعّل خيار Encapsulate Fields ليحوّلها NetBeans إلى private تلقائيًّا، ثم اضغط Generate.
  2. أضف شروطك داخل دوال set، كما في التدريب 10.
نافذة توليد دوال get و set
نافذة Generate Getters and Setters: تحديد الخصائص وتفعيل Encapsulate Fields

٨فوائد التغليف

🛡️ حماية البياناتلا قيم غير صالحة: كلمة مرور قصيرة، عمر سالب…
🔧 سهولة التعديلتغيّر طريقة التخزين داخل الكلاس دون أن تتأثر الكلاسات الأخرى.
👁️ تحكّم في القراءةتستطيع إعادة القيمة بالشكل الذي تريده، أو منع قراءتها بحذف get.

توقّع وتحقّق

أي رأس صحيح لدالة بناء في الكلاس Book؟

متى تُستدعى دالة البناء؟

ماذا يُطبع لخاصية نصية لم نعطها قيمة؟

في this.id = id; الكلمة this تشير إلى:

الدالة التي تعيد قيمة الخاصية name تُسمّى عادةً:

ما الناتج إذا رفضت setPassword القيمة ولم تُعطَ password قيمة قبلها؟

snippet
user.setPassword("12");   // أقل من 6System.out.println(user.getPassword());

أين نضع شرط «العمر لا يكون سالبًا»؟

الخلاصة

🧪 تدريبات المذكرة العملية

التدريب العملي 37: مشروع المكتبة libraryمن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←التدريب العملي 38: كلاس الطالب Studentمن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←التدريب العملي 39: تغليف كلاس المستخدممن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←انتقل إلى تقييم الدرسأسئلة الاختيار، وصح وخطأ، وأكمل الفراغات، والأسئلة العملية.ابدأ التقييم ←