import java.util.Locale;
import java.util.Scanner;
public class hmd2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a string: ");
String input = scanner.nextLine();
boolean running = true;
while (running) {
System.out.println("\nChoose an operation:");
System.out.println("1. Get a character at a specific index (charAt)");
System.out.println("2. Get the length of the string (length)");
System.out.println("3. Create a substring from a start index (substring)");
System.out.println("4. Create a substring from start to end indices (substring)");
System.out.println("5. Compare the string with another string (equals)");
System.out.println("6. Check if the string is empty (isEmpty)");
System.out.println("7. Concatenate strings (concat)");
System.out.println("8. Replace a character with another (replace)");
System.out.println("9. Split the string into words (split)");
System.out.println("10. Split the string into words with a limit (split with limit)");
System.out.println("11. Get the string from the constant pool (intern)");
System.out.println("12. Find the index of a character (indexOf)");
System.out.println("13. Find the index of a character from a specific position (indexOf with start index)");
System.out.println("14. Find the index of a substring (indexOf substring)");
System.out.println("15. Find the index of a substring from a specific position (indexOf substring with start index)");
System.out.println("16. Convert the string to lowercase (toLowerCase)");
System.out.println("17. Convert the string to lowercase with locale (toLowerCase with Locale)");
System.out.println("18. Convert the string to uppercase (toUpperCase)");
System.out.println("19. Convert the string to uppercase with locale (toUpperCase with Locale)");
System.out.println("20. Trim whitespace from the string (trim)");
System.out.println("21. Exit");
System.out.print("Enter your choice: ");
int choice = scanner.nextInt();
scanner.nextLine();
JAVA OOP
واجب الهياكل (مختبر) ,/علوم صباحي البرنامج المطلوب: ١-قراءة خيط رمزي ٢-loop لكل الدوال المراد تطبيقها على الخيط الرمزي ٣- ادخال رقم الاختيار ٤-switch لتحديد العمليه المراد تنفيذها بناءا على الخيار المدخل ٥-من ضمن الخيارات خيار الخروج من البرنامج
switch (choice) {
case 1:
System.out.print("Enter the index: ");
int index = scanner.nextInt();
if (index >= 0 && index < input.length()) {
System.out.println("Character at index " + index + " is: " + input.charAt(index));
} else {
System.out.println("Invalid index.");
}
break;
case 2:
System.out.println("Length of the string: " + input.length());
break;
case 3:
System.out.print("Enter the starting index: ");
int start = scanner.nextInt();
if (start >= 0 && start < input.length()) {
System.out.println("Substring: " + input.substring(start));
} else {
System.out.println("Invalid start index.");}
break;
case 4:
System.out.print("Enter the starting index: ");
start = scanner.nextInt();
System.out.print("Enter the ending index (exclusive): ");
int end = scanner.nextInt();
if (start >= 0 && end <= input.length() && start < end) {
System.out.println("Substring: " + input.substring(start, end));
} else {
System.out.println("Invalid indices.");
}
break;
case 5:
System.out.print("Enter another string to compare: ");
String another = scanner.nextLine();
System.out.println("Strings are equal: " + input.equals(another));
break;
case 6:
System.out.println(input.isEmpty() ? "The string is empty." : "The string is not empty.");
break;
case 7:
System.out.print("Enter another string to concatenate: ");
String secondInput = scanner.nextLine();
System.out.println("Concatenated string: " + input.concat(secondInput));
break;
case 8:
System.out.print("Enter the character to replace: ");
char oldChar = scanner.next().charAt(0);
System.out.print("Enter the new character: ");
char newChar = scanner.next().charAt(0);
input = input.replace(oldChar, newChar);
System.out.println("Updated string: " + input);
break;
case 9:
String[] words = input.split(" ");
System.out.println("Words:");
for (String word : words) {
System.out.println(word);
}
break;
case 10:
System.out.print("Enter the maximum number of parts: ");
int limit = scanner.nextInt();
String[] parts = input.split(" ", limit);
System.out.println("Parts:");
for (String part : parts) {
System.out.println(part);
}
break;
case 11:
input = input.intern();
System.out.println("The string is now stored in the constant pool.");
break;
JAVA OOP
واجب الهياكل (مختبر) ,/علوم صباحي البرنامج المطلوب: ١-قراءة خيط رمزي ٢-loop لكل الدوال المراد تطبيقها على الخيط الرمزي ٣- ادخال رقم الاختيار ٤-switch لتحديد العمليه المراد تنفيذها بناءا على الخيار المدخل ٥-من ضمن الخيارات خيار الخروج من البرنامج
case 12:
System.out.print("Enter the character to search for: ");
char searchChar = scanner.next().charAt(0);
int position = input.indexOf(searchChar);
System.out.println(position != -1 ? "Found at position: " + position : "Character not found.");
break;
case 13:
System.out.print("Enter the character to search for: ");
searchChar = scanner.next().charAt(0);
System.out.print("Enter the starting index for the search: ");
int fromIndex = scanner.nextInt();
position = input.indexOf(searchChar, fromIndex);
System.out.println(position != -1 ? "Found at position: " + position : "Character not found.");
break;
case 14:
System.out.print("Enter the substring to search for: ");
String substring = scanner.nextLine();
position = input.indexOf(substring);
System.out.println(position != -1 ? "Found at position: " + position : "Substring not found.");
break;
case 15:
System.out.print("Enter the substring to search for: ");
substring = scanner.nextLine();
System.out.print("Enter the starting index for the search: ");
fromIndex = scanner.nextInt();
position = input.indexOf(substring, fromIndex);
System.out.println(position != -1 ? "Found at position: " + position : "Substring not found.");
break;
case 16:
System.out.println("String in lowercase: " + input.toLowerCase());
break;
case 17:
System.out.println("String in lowercase (with locale): " + input.toLowerCase(Locale.getDefault()));
break;
case 18:
System.out.println("String in uppercase: " + input.toUpperCase());
break;
case 19:
System.out.println("String in uppercase (with locale): " + input.toUpperCase(Locale.getDefault()));
break;
case 20:
System.out.println("Trimmed string: '" + input.trim() + "'");
break;
case 21:
System.out.println("Exiting the program...");
running = false;
break;
default:
System.out.println("Invalid choice. Please try again.");}}}}
🤣1
مسار oop على قناه عادل نسيم
)
1. ما هي OOP؟
تعريف البرمجة كائنية التوجه.
الفرق بينها وبين البرمجة الإجرائية.
أهمية استخدام OOP في البرمجة.
2. المفاهيم الأربعة الأساسية في OOP:
الكائنات (Objects).
الفئات (Classes).
التغليف (Encapsulation).
الوراثة (Inheritance).
التعددية (Polymorphism).
هذا شرح مقدمه عن oop
https://youtu.be/FaaM6uVbuJM?si=MR4JILOZ_499-gq-
الشرح
https://youtu.be/JIPwPCkYoLY?si=56aBhkx7vJih_z7F
وهم راح يشرح مثالين كلش مهمات
وهذا الشرح
https://youtu.be/7iMtBSktIKw?si=lJxp7gbL4UKQl7hN
الجزء الاول
https://youtu.be/mfIAAwDbdag?si=9ayVWifgglOzv7j7
الجزء الثاني
https://youtu.be/rrgQ5P1g6Ys?si=D7gym7oo_GfMRCDg
https://youtu.be/7DbGHC8rF14?si=hsJAUw4EqWo00xme
الجزء الثاني
https://youtu.be/3n47zkGMIxc?si=t809Sw3_a7ZKkZ_6
وهذا شرحه
https://youtu.be/vnzteHmCIg0?si=hjXSiONQwLVZhUip
✅لخطوة الأولى: المقدمة إلى البرمجة كائنية التوجه (OOP
)
1. ما هي OOP؟
تعريف البرمجة كائنية التوجه.
الفرق بينها وبين البرمجة الإجرائية.
أهمية استخدام OOP في البرمجة.
2. المفاهيم الأربعة الأساسية في OOP:
الكائنات (Objects).
الفئات (Classes).
التغليف (Encapsulation).
الوراثة (Inheritance).
التعددية (Polymorphism).
هذا شرح مقدمه عن oop
https://youtu.be/FaaM6uVbuJM?si=MR4JILOZ_499-gq-
✅الخطوه الثانيه:
راح نكتب اول برنامج بالoop وويشرحه بالتفصيل الممل واخر شي راح يشرح Access modifiers
وتعتبر من اهم اساسيات oop
الشرح
https://youtu.be/JIPwPCkYoLY?si=56aBhkx7vJih_z7F
وهم راح يشرح مثالين كلش مهمات
وهذا الشرح
https://youtu.be/7iMtBSktIKw?si=lJxp7gbL4UKQl7hN
لحد لهنا ضروري تفهمهن حتلو تعيد الشرح اكثر من مره وكلش عادي اذا مافهمت مره ومرتين لان ماده جديده فه اكيد ماتكون سهله الفهم
✅الخطوه الثالثه
راح يشرح .
Constructor
بالانواعه الاربعه مع امثله
و
Method Overloading
الجزء الاول
https://youtu.be/mfIAAwDbdag?si=9ayVWifgglOzv7j7
الجزء الثاني
https://youtu.be/rrgQ5P1g6Ys?si=D7gym7oo_GfMRCDg
✅ الخطوه الرابعه ونووب اخذناالجزء الاول
static keywords
هنه وانواعه مع امثله
https://youtu.be/7DbGHC8rF14?si=hsJAUw4EqWo00xme
الجزء الثاني
https://youtu.be/3n47zkGMIxc?si=t809Sw3_a7ZKkZ_6
✅الخطوه الخامسه
واخر موضوع راح ناخذه بالكورس الاول وهوه
الوراثه
inheritance
وهذا شرحه
https://youtu.be/vnzteHmCIg0?si=hjXSiONQwLVZhUip
YouTube
#030 [JAVA] - Introduction to Object-Oriented Programming
كورس البرمجة الكينونية باستخدام لغة البرمجة جافا:
ما هي البرمجة كائنية التوجه وما هو الكلاس والاوبجكت والفرق بينهما؟
Course Object-Oriented Programming Using JAVA:
What is object-oriented programming, What Is the Difference Between Classes and Objects?…
ما هي البرمجة كائنية التوجه وما هو الكلاس والاوبجكت والفرق بينهما؟
Course Object-Oriented Programming Using JAVA:
What is object-oriented programming, What Is the Difference Between Classes and Objects?…
❤4🔥1👏1🤣1
JAVA OOP
مسار oop على قناه عادل نسيم ✅لخطوة الأولى: المقدمة إلى البرمجة كائنية التوجه (OOP ) 1. ما هي OOP؟ تعريف البرمجة كائنية التوجه. الفرق بينها وبين البرمجة الإجرائية. أهمية استخدام OOP في البرمجة. 2. المفاهيم الأربعة الأساسية في OOP: الكائنات (Objects).…
هذا مسار يخص كلشي اخذنا والشرح كلش مقارب للملازم تكدرون تعتمدون عليه واكيد راح ننزل امثله بكل المواضيع بالايام الجايه وضروري ادرسون لان مابقه شي عن نهايه الكورس الاول والماده لحد الان زينه
واكيد لو لكيت شرح افضل راح انزله الكم
❤🔥3💋2🤣1
مرحبا جميعا , راح اشرح ألكم مفاهيم البرمجة الكيانية الاساسية التي بضوئها نصل الى فهم اساسيات البرمجة الكيانية التوجه فخلونه نبدي
ملخص مفاهيم :
مقدمة :
. بدايتا نفس ما نعرف كلنا ان البرمجة هي وسيلة وصفية لأعطاء أوامر الى الحاسوب وهذه الأوامر لها نسق منطقي وهدف هذا النسق المرتب بطريقة متسلسلة هو حل مشكلة برمجية او واقعية وبالتالي نكدر نكول ان البرمجة هي اداة لا غير والأعتماد الكلي هو على فهم منطقية هذه الأوامر من دون حفظ! ,
. ولازم نعرف شلون نسوي نسق منطقي متسلسل في اعطار اوامر للحاسوب فبكل بساطة نكدر نعتمد بشكل كلي على ثلاث اشياء رئيسية وهم :
عملية الأدخال ومعالجة هذه المدخلات والحصول على مخرجات معينه
هي هاي البرمجة بكل اختصار!
————————————
البرمجة الهيكلية والكيانية التوجه :
1)
وهذا الشيء ينقلنا الى نسق برمجي قد تلعمناه في المرحلة الأولى وهو البرمجة الهيكلية او بسمى اخر :
Procedural Programming or Procedural Oriented Programming ( POP )
وبكل بساطة حسنه الكود بدل ما يكون الكود البرمجي متسلسل كله في الدالة الرئيسية بطريقة المدخلات ومعالجة هذه المدخلات والحصول على المخرجات
هنا ضلينه نسوي دالة هي وضيفتها الأدخال ثم سوينه دالة وضيفتها تعالج هذه المدخلات ثم دالة تضهر هذه المدخلات على الشاشة ,
تلاحظون نفس الفكرة! بس الأسلوب تغير وتعرفنا فائدة هذا الأسلوب سابقا كمراجعة يسهل علي حياتي كمبرمج في تجزئة الكود وجعله اكثر كفائة ويقلل كتابة الكود المتكرر وهذا الشيء وهذا الشي لاحضناه في المصفوفات ,
2)
والنسق الأخر والذي نستعمله في ترتيب الكود هو البرمجية الكائنية او بمسمى اخر :
Object Oriented Programming ( OOP )
ونكدر نكول بهذا النسق الجديد كدرنا ان نوسع افاقنا كمبرمجين بجعل الكود اكثر واقعية وتقريب البرمجة من الواقع بمفاهيمها ولكن تضل الثلاث شغلات نفسها ( اداخل , معالجة , اخراج ) مع اختلاف اسلوب ترتيب وتنسيق الكود بطريقة متسلسلة ,
ويتمحور هذا الأسلوب البرمجي حول كيف ادارة البيانات وكيف انشاء نسق لسلوك معين لشيء واقعي ان كان حركة او وظيفة معينة ,
قبل ما ندخل الى الفروقات لازم نعرف شنو هو مفهوم الكيان او الكائن ؟
فنكدر نوصل فكرته هو تعميم لكل شيء في الحياة ان كان فيه روح او لم يكن فيه روح , ومن المنطقي اي كائن فيه روح له وظائف وله اشياء جمالية كالون او قد يكون ليس له روح كالسيارة ولكن لها وظائف كالفرامل والحركة واشياء جمالية كطول السيارة او شكل السيارة
فبأختصار الكيان = وظائف + بيانات
وهو يعتبر مفهوم لا غير وهو يعتبر بوابة لفهم البرمجة الكيانية واسلوب استخدام الكود لحل مشكلة معينه
————————————
اهم الفروقات بين البرمجة الهيكلية والبرمجة الكيانية :
بالمختصر بالهيكلية :
- نستخدم الدوال فقط تمرير واستقبال البيانات
- اسلوب غير امن لان لا توجد طريقة مناسبة لأخفاء البينات
- ما نكدر نسوي overloading :
التالي لازم ألتزم بنوع البياني للمرسل والمستقبل حتى ما يصير عندي خسارة بالبينات او حتى ما يصير عندي ايرور
بالمختصر بالكيانية :
- نستخدم وصف كيان عندما ننشئ حقل من البياتات ( كائن )
- نستخدم تعليمات طرق الوصول لتحديد مَن يمكن له ان يصل لبينات هذا الكائن او دوال هذا الكائن ( داخل الكلاس )
- عندما ننشئ كيان جديد ونرسل وسائط او argument من هذا الكائن يجب ان يكون هناك مكان لأستقبال هذه الوسائط كمعلمات من نفس اسم الكلاس او الفئة
بمعنى عدنا هنا دالة خاصة للكائن موجودة داخل الكلاس نسميها constructor
- نكدر نسوي overloading :
وهذا الشكل اتاحلنا مرونه بعدم الألتازم بنوع البياني للدالة المستقبلة او معالم الدالة المستقبلة وبهذا الشكل ما نخسر بينات ونسوي دالة واحدة تستقبل مختلف السيناريوهات المرسلة والمسقبِلة
————————————
❤3
نكدر نسمي object بـ instance اي حالة , ( حالة من الكلاس )
وايضا نكدر نسمي Object بـ :
Reference variables or Object references)
نكدر نسمي behaviors بـ properties اي خصائص ( دوال و متغيرات ) وايضا نكدر نسميهم بـ instance Variables متغيرات الحالة , لان الكيان هو حالة من الكلاس اي نسخة من الكلاس
وهمين نكدر نسمي class بـ characteristics
وايضا نكدر نسمي Object بـ :
Reference variables or Object references)
نكدر نسمي behaviors بـ properties اي خصائص ( دوال و متغيرات ) وايضا نكدر نسميهم بـ instance Variables متغيرات الحالة , لان الكيان هو حالة من الكلاس اي نسخة من الكلاس
وهمين نكدر نسمي class بـ characteristics
👏1
JAVA OOP
Photo
اساسيات مبادئ البرمجة الكائنية :
- Class and object الكيان والصف ( اخذناها )
- Inheritance الوراثة ( بعدنا ما وصلنالها )
- Abstraction التجريد
- Polymorphism تعدد الأشكال
- Encapsulation التغليف
- Class and object
الكيان عرفنه مفهومه الان يجب ان نتعلم شنو هو الصف بالمفهوم البرمجي
اريدكم تتخيلون وياي صف دراسي شنو راح تلكون بيه برئيكم؟
راح نلكه رحلات وصبورة وطلاب ومدرس فبتالي داخل هذا الصف الدراسي اكو أما عدد الطلاب وعدد الرحلات وتعليمات تبين ماذا سوف يقوم به الأستاذ داخل هذا الصف الدراسي
بهذا الشكل اصبحت كلمة الصف معبرة جدا عن مفوم الصف بشكل عام في البرمجة الكيانية
فعندنا نريد ان ننشيء كائن يجب ان يحتوي داخل هذا الكائن مقاييس وايضا طرق توضح كيف يعمل وتفاعل هذا الكائن مع اي ردة فعل تعطى له من القيم المرسلة ,
خلاصة الحجي :
Class = Structure + behaviors
=> Structure = نمط او هيكل كتابي برمجي يتسم به فقط هو الكلاس
=> behaviors = properties = attributes ( member ) + method
مثال :
class Student {
int S1 = 10;
}
فالمتغير الموجود داخل الكلاس S1 راح نسميه Instance variables or memebr المتغير التابع للكائن او العضو التابع للكائن
والقيمة 10 تمثل بيانات الكائن او بيانات العضو Data member
وبشكل عام نكدر نكول ان :( int S1 = 10 ) ككل نكدر سميها Data Fields او حقل البيانات
خلاصة الحجي :
اذا ردنا نسوي كائن لازم نسوي قالب لهذا الكائن وهو الصف
ويحتوي داخل هذا القالب متغيرات ودوال تابعة للصف وبدوره الصف تابع الى الكائن
ملاحظة : اي دالة نسويها داخل Class راح نسميها الدالة التابعة الى الصف Class method
——-
- Polymorphism : تعدد الأشكال
بكل اختصال عندما نستعمل Overloading او التحميل الزائد للدوال راح نحصل على نفس الدوال ولكن بأشكال مختلفة لهذا السبب نطلق عليها تعدد الأشكال
——-
لازم نتفق كل كائن له صف تابع لهُ ولكل صف متغيرات ودوال تابعه لهُ , ومن خلال الكائن نصل الى المتغيرات او الدوال الموجودة داخل الكلاس , فعندما نصل يمكن ان نسند قيم الى المتغيرات او نرسل وسائط , وهذه النقطة تنقلني الى تمثيل البرنامج الى ثلاث تقسيمات اداخل معالجة اخراج فبتالي من خلال الكائن ندخل بيانات الى المتغيرات الموجودة في الكلاس ومن خلال الكائن نرسل وسائط حتى يتم معالجتها ومن خلال الكائن نستدعي دالة الطباعة الموجوة داخل الكلاس تلاحضون!! نفس المبدأ ولكن هيكلية الكود اختلفت .
خلاصة خلاصة الخلاصة :
الكلاس بحد ذاته هو قالب أو مخطط، بينما الكائن هو التمثيل الحقيقي الذي يُنشأ بناءً على هذا القالب , بمعنى :
الكلاس : هو التصميم النظري أو الهيكل الذي يحتوي على تعريف للخصائص (attributes) والسلوكيات (methods).
الكائن : هو تطبيق عملي لهذا التصميم. بمجرد إنشاء كائن من كلاس، يصبح هذا الكائن قادرًا على تخزين بيانات فريدة به واستخدام السلوكيات المحددة في الكلاس.
مثال لتوضيح الفكرة :
تخيل أن الكلاس هو مخطط لتصميم سيارة:
يحتوي المخطط على الخصائص (مثل اللون، عدد الأبواب، نوع المحرك).
ويحتوي على السلوكيات (مثل القيادة، التوقف، التسارع).
عندما تبني سيارة فعلية باستخدام هذا المخطط، فإن هذه السيارة هي كائن.
أي أن السيارة تحتوي على اللون ونوع المحرك الخاص بها، ويمكنك قيادتها أو إيقافها.
وبالتالي نستنتج من نسوي كيان من نوع الكلاس كأن جاي نسوي نوع بياني خاص بينه لهذا السبب يسمونه user defined data type اي المستخدم الذي يبرمج او المبرمج هو الذي يصنعهُ ,
————————————
Class components : مكونات الصف
بأختصار نكدر نخلي داخل القالب او الكلاس ثلاث اشياء فقط وهم :
1- Memebrs
2- methods
3- constructors
————————————
- Class and object الكيان والصف ( اخذناها )
- Inheritance الوراثة ( بعدنا ما وصلنالها )
- Abstraction التجريد
- Polymorphism تعدد الأشكال
- Encapsulation التغليف
- Class and object
الكيان عرفنه مفهومه الان يجب ان نتعلم شنو هو الصف بالمفهوم البرمجي
اريدكم تتخيلون وياي صف دراسي شنو راح تلكون بيه برئيكم؟
راح نلكه رحلات وصبورة وطلاب ومدرس فبتالي داخل هذا الصف الدراسي اكو أما عدد الطلاب وعدد الرحلات وتعليمات تبين ماذا سوف يقوم به الأستاذ داخل هذا الصف الدراسي
بهذا الشكل اصبحت كلمة الصف معبرة جدا عن مفوم الصف بشكل عام في البرمجة الكيانية
فعندنا نريد ان ننشيء كائن يجب ان يحتوي داخل هذا الكائن مقاييس وايضا طرق توضح كيف يعمل وتفاعل هذا الكائن مع اي ردة فعل تعطى له من القيم المرسلة ,
خلاصة الحجي :
Class = Structure + behaviors
=> Structure = نمط او هيكل كتابي برمجي يتسم به فقط هو الكلاس
=> behaviors = properties = attributes ( member ) + method
مثال :
class Student {
int S1 = 10;
}
فالمتغير الموجود داخل الكلاس S1 راح نسميه Instance variables or memebr المتغير التابع للكائن او العضو التابع للكائن
والقيمة 10 تمثل بيانات الكائن او بيانات العضو Data member
وبشكل عام نكدر نكول ان :( int S1 = 10 ) ككل نكدر سميها Data Fields او حقل البيانات
خلاصة الحجي :
اذا ردنا نسوي كائن لازم نسوي قالب لهذا الكائن وهو الصف
ويحتوي داخل هذا القالب متغيرات ودوال تابعة للصف وبدوره الصف تابع الى الكائن
ملاحظة : اي دالة نسويها داخل Class راح نسميها الدالة التابعة الى الصف Class method
——-
- Polymorphism : تعدد الأشكال
بكل اختصال عندما نستعمل Overloading او التحميل الزائد للدوال راح نحصل على نفس الدوال ولكن بأشكال مختلفة لهذا السبب نطلق عليها تعدد الأشكال
——-
لازم نتفق كل كائن له صف تابع لهُ ولكل صف متغيرات ودوال تابعه لهُ , ومن خلال الكائن نصل الى المتغيرات او الدوال الموجودة داخل الكلاس , فعندما نصل يمكن ان نسند قيم الى المتغيرات او نرسل وسائط , وهذه النقطة تنقلني الى تمثيل البرنامج الى ثلاث تقسيمات اداخل معالجة اخراج فبتالي من خلال الكائن ندخل بيانات الى المتغيرات الموجودة في الكلاس ومن خلال الكائن نرسل وسائط حتى يتم معالجتها ومن خلال الكائن نستدعي دالة الطباعة الموجوة داخل الكلاس تلاحضون!! نفس المبدأ ولكن هيكلية الكود اختلفت .
خلاصة خلاصة الخلاصة :
الكلاس بحد ذاته هو قالب أو مخطط، بينما الكائن هو التمثيل الحقيقي الذي يُنشأ بناءً على هذا القالب , بمعنى :
الكلاس : هو التصميم النظري أو الهيكل الذي يحتوي على تعريف للخصائص (attributes) والسلوكيات (methods).
الكائن : هو تطبيق عملي لهذا التصميم. بمجرد إنشاء كائن من كلاس، يصبح هذا الكائن قادرًا على تخزين بيانات فريدة به واستخدام السلوكيات المحددة في الكلاس.
مثال لتوضيح الفكرة :
تخيل أن الكلاس هو مخطط لتصميم سيارة:
يحتوي المخطط على الخصائص (مثل اللون، عدد الأبواب، نوع المحرك).
ويحتوي على السلوكيات (مثل القيادة، التوقف، التسارع).
عندما تبني سيارة فعلية باستخدام هذا المخطط، فإن هذه السيارة هي كائن.
أي أن السيارة تحتوي على اللون ونوع المحرك الخاص بها، ويمكنك قيادتها أو إيقافها.
وبالتالي نستنتج من نسوي كيان من نوع الكلاس كأن جاي نسوي نوع بياني خاص بينه لهذا السبب يسمونه user defined data type اي المستخدم الذي يبرمج او المبرمج هو الذي يصنعهُ ,
————————————
Class components : مكونات الصف
بأختصار نكدر نخلي داخل القالب او الكلاس ثلاث اشياء فقط وهم :
1- Memebrs
2- methods
3- constructors
————————————
🔥1
JAVA OOP
اساسيات مبادئ البرمجة الكائنية : - Class and object الكيان والصف ( اخذناها ) - Inheritance الوراثة ( بعدنا ما وصلنالها ) - Abstraction التجريد - Polymorphism تعدد الأشكال - Encapsulation التغليف - Class and object الكيان عرفنه مفهومه الان يجب ان نتعلم شنو…
هسه عرفنه ان الكيان يعتبر user defined data type
————————————
Access Modifiers for members : طرق الوصل الى الأعضاء
1- Private : خاص
بمعنى لو خليت Private الى العضو فبداخل الكلاس نكدر نوصله بس لو ردت أوصله من خلال الكائن ما راح أكدر
2- Public : عام
لو خليت Public الى العضو بداخل الكلاس نكدر نوصله والكائن يكدر يوصله واذا ردت اسوي حزمه واضع فيها الكود يكدرون يوصلوله وخارج الحزمة همين يكدرون يوصلوله يعني تاايه وما يدري وين الله حاطة
3- Default : الشيء الأفتراضي
هاي اذا اصلا ما خلينه كلشي للعضو بداخل الكلاس فهو افتراضيا او معيارياً دائما راح يكون Default فنكدر نوصله من داخل الكلاس ويكدر الكائن يوصله
————————————
من استخدامات Private للأعضاء فعندما ارسل ارفع الكود كحزمه على الأنترنت ليتسنى على الكل استخدام الكود فما اريدهم يوصلون الى المتغير او يرونه بالأساس فلهذا السبب نخليه خاص ثم نسوي دالة وضيفتها فقط تحول المتغير الخاص الى متغير يمكن الوصل اليه , مثال :
Access Modifiers for members : طرق الوصل الى الأعضاء
1- Private : خاص
بمعنى لو خليت Private الى العضو فبداخل الكلاس نكدر نوصله بس لو ردت أوصله من خلال الكائن ما راح أكدر
2- Public : عام
لو خليت Public الى العضو بداخل الكلاس نكدر نوصله والكائن يكدر يوصله واذا ردت اسوي حزمه واضع فيها الكود يكدرون يوصلوله وخارج الحزمة همين يكدرون يوصلوله يعني تاايه وما يدري وين الله حاطة
3- Default : الشيء الأفتراضي
هاي اذا اصلا ما خلينه كلشي للعضو بداخل الكلاس فهو افتراضيا او معيارياً دائما راح يكون Default فنكدر نوصله من داخل الكلاس ويكدر الكائن يوصله
————————————
من استخدامات Private للأعضاء فعندما ارسل ارفع الكود كحزمه على الأنترنت ليتسنى على الكل استخدام الكود فما اريدهم يوصلون الى المتغير او يرونه بالأساس فلهذا السبب نخليه خاص ثم نسوي دالة وضيفتها فقط تحول المتغير الخاص الى متغير يمكن الوصل اليه , مثال :
Class Area {
private int Bass = 10;
private int Hight = 20
public getPrivateBase( ) {
return Base;
}
public getPrivateHight( ) {
return Hight;
}
}❤3👏1
————————————
Methods Overloading : التحميل الزائد للدوال
هي مجموعة من الدوال يكونون بنفس الأسم ولكن الشيء المختلف بينهم هو النوع البياني للدالة والأنواع البيانية لـ Parameters وترتيب Parameters
مع ملاحظة يجب ان نكتب هذه الدوال فقط داخل الكلاس التابع للكائن ولا يصح ان نكتبها فوق الدالة الرئيسية اي داخل الكلاس الرئيسي
مثال// اكتب
ملاحظة : مهم نعرف مصطلح يطلق على اسم الدالة وعلى معالم الدالة وهو Signature يعني من نسمع هذا المصطلح ترا الحجي عن الدالة او method
Methods Overloading : التحميل الزائد للدوال
هي مجموعة من الدوال يكونون بنفس الأسم ولكن الشيء المختلف بينهم هو النوع البياني للدالة والأنواع البيانية لـ Parameters وترتيب Parameters
مع ملاحظة يجب ان نكتب هذه الدوال فقط داخل الكلاس التابع للكائن ولا يصح ان نكتبها فوق الدالة الرئيسية اي داخل الكلاس الرئيسي
مثال// اكتب
class clSum
{
public int SumTowNumbers(int Number1,int Number2)
{
return Number1 + Number2;
}
public double SumTowNumbers(double Number1, double Number2)
{
return Number1 + Number2;
}
public double SumTowNumbers(double Number1, int Number2)
{
return Number1 + Number2;
}
public double SumTowNumbers(int Number1, double Number2)
{
return Number1 + Number2;
}
}
public class Main
{
public static void main(String[] args)
{
clSum Sum = new clSum();
System.out.println("1) Sum = " + Sum.SumTowNumbers(1,1)); // 2
System.out.println("2) Sum = " + Sum.SumTowNumbers(1.3,1)); // 2.3
System.out.println("3) Sum = " + Sum.SumTowNumbers(1,1.5)); // 2.5
System.out.println("4) Sum = " + Sum.SumTowNumbers(2.2,3.3)); // 5.5
}
}
ملاحظة : مهم نعرف مصطلح يطلق على اسم الدالة وعلى معالم الدالة وهو Signature يعني من نسمع هذا المصطلح ترا الحجي عن الدالة او method
👏4
————————————
Constructor method : الدالة المنشئة او البنائات
هي دالة خاصة نستفيد منها لوضع بيانات الى الأعضاء او memebrs بشكل افتراضي , يعني هذولي الأعضاء اذا ما خليت قيم افتراضية من عندي واجيت اطبعهم راح ينطبعن حسب القيم الأفتراضية ألي خالينها مشئيي جافا فحتى اغيرها بشكل ديناميكي نكدر نستعمل انواع الدوال المنشئة
الان هل هناك بعد فيزيائي او تأثير على ذاكرة RAM من نسوي كيان و كونستركتر؟
الجواب نعم , فمن نسوي كيان اساسا راح نحجز في ذاكرة RAM مكان في Heap و pool Memory
حقيقة :
كل مرة نسوي كلاس ونسوي كيان تابع للكلاس فنهاك على الأقل اكو Constructor من نوع Default Constructor
يعني اول ما نسوي الكلاس والكيان فاكو كونستركتر بس مخفي من اللغة وظيفته فقط تهيئة members بقيم افتراضية فهو المسؤال اذا عرفنه متغير وما خليناله قيمه وطبعناه يطلع عندي قيمة افتراضية ألة في جافا فقط طبعا .
يعتبر الكونستركتر دالة ليس لها نوع بياني وبالتالي ما نكتب return الها ولا هي void , بس نكدر تحدد طريقة الوصول ألها , حيث أنها تكون بنفس أسم الكلاس
حتى تكون الصورة واضحة من نسوي كلاس و نسوي كيان فأحنه هنا بالحقيقة سوينه كونستركتر
مثال :
Scanner object = new Scanner( System.in );
فهذا الجزء راح نسميه كونستركتر Scanner( System.in ) والقيمة الذي يرسلها System.in تعتبر وسائط او argument تمام؟
————————————
Constructor method : الدالة المنشئة او البنائات
هي دالة خاصة نستفيد منها لوضع بيانات الى الأعضاء او memebrs بشكل افتراضي , يعني هذولي الأعضاء اذا ما خليت قيم افتراضية من عندي واجيت اطبعهم راح ينطبعن حسب القيم الأفتراضية ألي خالينها مشئيي جافا فحتى اغيرها بشكل ديناميكي نكدر نستعمل انواع الدوال المنشئة
الان هل هناك بعد فيزيائي او تأثير على ذاكرة RAM من نسوي كيان و كونستركتر؟
الجواب نعم , فمن نسوي كيان اساسا راح نحجز في ذاكرة RAM مكان في Heap و pool Memory
حقيقة :
كل مرة نسوي كلاس ونسوي كيان تابع للكلاس فنهاك على الأقل اكو Constructor من نوع Default Constructor
يعني اول ما نسوي الكلاس والكيان فاكو كونستركتر بس مخفي من اللغة وظيفته فقط تهيئة members بقيم افتراضية فهو المسؤال اذا عرفنه متغير وما خليناله قيمه وطبعناه يطلع عندي قيمة افتراضية ألة في جافا فقط طبعا .
يعتبر الكونستركتر دالة ليس لها نوع بياني وبالتالي ما نكتب return الها ولا هي void , بس نكدر تحدد طريقة الوصول ألها , حيث أنها تكون بنفس أسم الكلاس
حتى تكون الصورة واضحة من نسوي كلاس و نسوي كيان فأحنه هنا بالحقيقة سوينه كونستركتر
مثال :
Scanner object = new Scanner( System.in );
فهذا الجزء راح نسميه كونستركتر Scanner( System.in ) والقيمة الذي يرسلها System.in تعتبر وسائط او argument تمام؟
————————————
❤3👏1
Constructor method v.s Java methods : الفرق بين دوال جافا والدالة المنشئة
Constructor method :
Java methods :
أي الفرق بينهما ان الكونستركتر اول ما نسوي كائن والمترجم يدخل الى كلاس الكائن وعندما يصل الى الكونستركتر راح يدخل داخل دالة الكونستركتر وينفذي شكو شي موجود طباعة , اسناد , معالجة , والخ.. من دون ما استدعيه من خلال الكائن بأستخدام النقطة ( . )
بينما الدالة الأعتيادية ألي بيها نوع مرجعي و تعليمة الأرجاع return لازم استدعيها حتى اوصل ألها داخل الكلاس تلاحظون الفرق شكد جبير ومفيد!
بالمختصر الكونستركتر ما نستدعيه في الدالة الرئيسية بينما الدالة الأعتيادية نستدعيها في الدالة الرئيسية وشكرا .
Constructor method :
class Example {
void displayMessage() {
System.out.println("Method called");
}
}
public class Main {
public static void main(String[] args) {
Example obj = new Example(); // Constructor is called (default in this case)
obj.displayMessage(); // Method is called
obj.displayMessage(); // Method is called again
}
}Java methods :
class Example {
void displayMessage() {
System.out.println("Method called");
}
}
public class Main {
public static void main(String[] args) {
Example obj = new Example(); // Constructor is called (default in this case)
obj.displayMessage(); // Method is called
obj.displayMessage(); // Method is called again
}
}أي الفرق بينهما ان الكونستركتر اول ما نسوي كائن والمترجم يدخل الى كلاس الكائن وعندما يصل الى الكونستركتر راح يدخل داخل دالة الكونستركتر وينفذي شكو شي موجود طباعة , اسناد , معالجة , والخ.. من دون ما استدعيه من خلال الكائن بأستخدام النقطة ( . )
بينما الدالة الأعتيادية ألي بيها نوع مرجعي و تعليمة الأرجاع return لازم استدعيها حتى اوصل ألها داخل الكلاس تلاحظون الفرق شكد جبير ومفيد!
بالمختصر الكونستركتر ما نستدعيه في الدالة الرئيسية بينما الدالة الأعتيادية نستدعيها في الدالة الرئيسية وشكرا .
👏3
Constructor Chaining : الدالة المنشئة المترابطة
بكل بساطة احنه مو سوينا كونستركتر داخل الكلاس مجرد نخلي تعلمية : this ( );
الهدف مِنها استدعاء داخل هذا الكونستركتر , كونستركتر اخر ونكدر نرسل له وسائط argument داخل اقواس this ( ) ويتم استقبالها في معالم الكونستركتر الاخر , فبعد ما نرسل راح المترج
راح يسئل هل هناك كونستركتر له معالم Parameters بنفس النوع البياني للوسائط argument المرسلة؟
اذا فعلا اكو فراح يشتغل بشكل طبيعي ويذهب البرنامج الى الكونستركتر الاخر وينفذ ما كتبناه فيه من اوامر وتعليمات , وخلافا لذالك راح يصير erorr .
ملاحظة : يحقلي استخدم تعلمية this( ) مرة واحدة فقط لكل كونستركتر اذا ما ألتزمنا بيها فراح يطلعلي erorr .
خلاصة الحجي كله : فكرة Constructor Chaining هي كأن جاي نسوي Nested Constructor اي كونستركتر متداخل بس بأستعمال تعليمة this ( )
الفائدة من Channing هو تقليل كتابة الكود المكرر وبهذا الشكل بالمشاريع الضخمة مهم جدا يخلونه بالحسبان .
ويجدر بالذكر ان الكونستركتر المترابط يستعمل في الوراثة وهذا الموضوع بعدنا ما وصلناله في البرمجة الكيانية
مثال يوضح طريقة استعماله :
ويجدر بالذكر من نسوي كونستركتر داخل الكلاس ونخلي داخله this ( ) بالحقيقة احنه جاي نصل الى كونستركتر اخر نفس ما نعرف فمو شرط الكونستركتر الاخر ألي اريد أوصله يكوت تحت الكونستركتر الأصلي ألي بيه this ( ) كلش طبيعي نكتب الكونستركتر الاخر فوق الكونستركتر الأصلي هم يكدر يوصله ويدخله يونفذ أوامره .
بمعنى ترتيب الكونستركتر مو كلش يفرق بس أحنه كمبرمجين مهم نراعي الترتيب حتى يسهل علينا قراءة الكود لاحقا .
مثال توضيحي :
ملاحظة مهمه جدا :
نكدر نستنتج طريقتين نكدر نوصل من خلالهم الى الكونستركتر داخل الكلاس , يفهم عن طريق هذا الكود :
بكل بساطة احنه مو سوينا كونستركتر داخل الكلاس مجرد نخلي تعلمية : this ( );
الهدف مِنها استدعاء داخل هذا الكونستركتر , كونستركتر اخر ونكدر نرسل له وسائط argument داخل اقواس this ( ) ويتم استقبالها في معالم الكونستركتر الاخر , فبعد ما نرسل راح المترج
راح يسئل هل هناك كونستركتر له معالم Parameters بنفس النوع البياني للوسائط argument المرسلة؟
اذا فعلا اكو فراح يشتغل بشكل طبيعي ويذهب البرنامج الى الكونستركتر الاخر وينفذ ما كتبناه فيه من اوامر وتعليمات , وخلافا لذالك راح يصير erorr .
ملاحظة : يحقلي استخدم تعلمية this( ) مرة واحدة فقط لكل كونستركتر اذا ما ألتزمنا بيها فراح يطلعلي erorr .
خلاصة الحجي كله : فكرة Constructor Chaining هي كأن جاي نسوي Nested Constructor اي كونستركتر متداخل بس بأستعمال تعليمة this ( )
الفائدة من Channing هو تقليل كتابة الكود المكرر وبهذا الشكل بالمشاريع الضخمة مهم جدا يخلونه بالحسبان .
ويجدر بالذكر ان الكونستركتر المترابط يستعمل في الوراثة وهذا الموضوع بعدنا ما وصلناله في البرمجة الكيانية
مثال يوضح طريقة استعماله :
class clCar
{
// Default Constructor
public clCar( ) {
this ( "Helo world" ); // Constructor Chaining to public clCar(String Text)
}
// Parameterized Constructor
public clCar(String Text) {
System.out.println(Text);
}
}
ويجدر بالذكر من نسوي كونستركتر داخل الكلاس ونخلي داخله this ( ) بالحقيقة احنه جاي نصل الى كونستركتر اخر نفس ما نعرف فمو شرط الكونستركتر الاخر ألي اريد أوصله يكوت تحت الكونستركتر الأصلي ألي بيه this ( ) كلش طبيعي نكتب الكونستركتر الاخر فوق الكونستركتر الأصلي هم يكدر يوصله ويدخله يونفذ أوامره .
بمعنى ترتيب الكونستركتر مو كلش يفرق بس أحنه كمبرمجين مهم نراعي الترتيب حتى يسهل علينا قراءة الكود لاحقا .
مثال توضيحي :
class clCar
{
// Parameterized Constructor
public clCar(String Text) {
System.out.println(Text);
}
// Default Constructor
public clCar( ) {
this ( "Helo world" ); // Constructor Chaining to public clCar(String Text)
}
}
ملاحظة مهمه جدا :
نكدر نستنتج طريقتين نكدر نوصل من خلالهم الى الكونستركتر داخل الكلاس , يفهم عن طريق هذا الكود :
import java.util.Scanner;
class clEmployee
{
public clEmployee(String MyName)
{
System.out.println("\nMay Name is: " + MyName);
}
public clEmployee()
{
this("Ali");
System.out.println("By using Constructor Chaining");
}
}
public class Main
{
public static void main(String[] args)
{
clEmployee Employee1,Employee2 ;
Employee1 = new clEmployee();
System.out.println("\n---------------------");
Employee2 = new clEmployee("Abdulhamid");
System.out.println("Using same class but does'nt use Chaining , we use Parameterized Constructor");
}
}
مختصر هذا الكود انو نفس الكلاس الي سوينه بيه Chaining نكدر نستعمله وندخل للكلاس مرة ثانية بأنشاء كائن جديد .
❤1
JAVA OOP
Constructor Chaining : الدالة المنشئة المترابطة بكل بساطة احنه مو سوينا كونستركتر داخل الكلاس مجرد نخلي تعلمية : this ( ); الهدف مِنها استدعاء داخل هذا الكونستركتر , كونستركتر اخر ونكدر نرسل له وسائط argument داخل اقواس this ( ) ويتم استقبالها في معالم الكونستركتر…
خلاصة :
عندي طريقتين ارسل بينات الى معالم الكونستركتر
الأولى عن طريق انشاء كائن في الدالة الرئيسية وارسل الوسائط
الثانية عن طريق تعليمية this ( ) الموجودة داخل الكونستركتر
وبالتالي صارت عندي فائدتين this ( ) هما ارسال قيم الى معالم كونستركتر اخر وايضا التنقل من كونستركتر الى اخر .
عندي طريقتين ارسل بينات الى معالم الكونستركتر
الأولى عن طريق انشاء كائن في الدالة الرئيسية وارسل الوسائط
الثانية عن طريق تعليمية this ( ) الموجودة داخل الكونستركتر
وبالتالي صارت عندي فائدتين this ( ) هما ارسال قيم الى معالم كونستركتر اخر وايضا التنقل من كونستركتر الى اخر .
Overloading Constructors : التحميل الزائد للدوال المنشئة
نفس Overloading ألي اخذناها قبل ولطالما الكونستركتر هي دالة خاصة ليس لها نوع بياني للدالة اي user defined data type
فالتلاعب يكمن في :
1- عدد معالم الكونستركتر
2- الأنواع البيانية لمعالم الكونستركتر
3- ترتيب معالم الكونستركتر
مثال :
وخلاصة الموضوع نكدر نسوي اكثر من كونستركتر بمختلف المعالم Parameter وبمختلف نوع Parameter وبمختلف ترتيب Parameter ,
بحيث لو سويت كيان داخل الدالة الرئيسية اكدر ارسل وسائط argument بألي يعجبني من ترتيب ونوع .
نفس Overloading ألي اخذناها قبل ولطالما الكونستركتر هي دالة خاصة ليس لها نوع بياني للدالة اي user defined data type
فالتلاعب يكمن في :
1- عدد معالم الكونستركتر
2- الأنواع البيانية لمعالم الكونستركتر
3- ترتيب معالم الكونستركتر
مثال :
class clStudent
{
String name;
int age;
// No-argument Constructor
public clStudent()
{
this.name = "Unknown";
this.age = 0;
}
// Parameterized constructor with one parameter
public clStudent(String name)
{
this.name = name;
this.age = 0;
}
// Parameterized constructor with Two parameter
public clStudent(String name, int age)
{
this.name = name;
this.age = age;
}
public void display()
{
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Main
{
public static void main(String[] args)
{
clStudent student1 = new clStudent(); // argument
clStudent student2 = new clStudent("Ali"); // argument
clStudent student3 = new clStudent("Mohammed", 20); // argument
System.out.println();
student1.display(); // Name: Unknown, Age: 0
student2.display(); // Name: Ali, Age: 0
student3.display(); // Name: Mona, Age: 20
}
}
وخلاصة الموضوع نكدر نسوي اكثر من كونستركتر بمختلف المعالم Parameter وبمختلف نوع Parameter وبمختلف ترتيب Parameter ,
بحيث لو سويت كيان داخل الدالة الرئيسية اكدر ارسل وسائط argument بألي يعجبني من ترتيب ونوع .
👏3
Forwarded from عبدالحميد
خلاصة String :
اول شي شنو هو String ?
بكل بساطة هو مجموعة من الأحرف متصلة مع بعضها البعض
مثل :
"Hello"
وهي بالأصل تكون بهذا الشكل
'h','e','l','l','o'
في معضم لغات البرمجة يكون string نوع بياني والذي يبنى كجزء من اللغة
ولهُ طريقتانِ لانشائه وهما :
1- Null Terminated : المنتهي بالعدم
حيث ان هذا التمثيل يكون بهذا الشكل :
char Src[] = {'h','e','l','l','o','\0 or $'};
ونلاحض في اخر هذه المصفوفة من الأحرف انها تنتهي بـما يسمى null
حيث انه رمز يمثل نهاية هذه السلسة وفائدته حتى يعلم المترجم compiler نهاية السلسة ويتوقف عندما يصل الى هذا الرمز
2- Pointer/Length : المؤشر والطول
حيث ان هذا التمثيل يكون بهذا الشكل :
String Name = "Ail";
حيث ان هنالك مؤشر في هذا التمثيل يؤشر على اول عنصر وهو A
وفي هذا التمثيل طول النص معروف لدى compiler
ويمكننا طباعة طول هذا النص عن طريق كتابة
System.out.print( Name.length() );
خلاصة الخلاصة :
عدنا تمثيلين للنص, التمثيل الأول النص عبارة عن مصفوفة من الأحرف , والثاني النص عبارة عن متغير من نوع نص بالأول ما يعرف المترجم نهاية المصفولة لذا يجب ان يمر بجميع الأحرف الى ان يصل الى \0 او $ حتى يتوقف , الثاني عدنا مؤشر ينضر الى اول حرف وعدنا الطول معلوم لذا يعرف المترجم متى يتوقف من دون ان في كل مرة يتحقق ويسأل وصلنه لو لا الطول معروف بعد ,
خلاصة خلاصة الخلاصة😂 :
Array of characters : char Name[] = { 'A','l','i' };
هنا المترجم ما يعرف طول المصفوفة
String DataType : String Name = "Ali";
هنا المترجم حاط عينه على اول حرف ويعرف طول المصفوفة
الخلاصة الكلية☠️ :
كل مصفوفة تنتهي دائما بnull Terminated (\0 or $ )
وكل متغير نصي طوله معروف وهناك مؤشر يؤشر على اول حرف في هذا النص
____________
زين ماذا يتعبر المتغير النصي في جافا؟؟؟؟
بكل بساطة هو كائن لديه خصائص حيث انهُ يمثل تسلسل من الحروف ,
حيث يمكن انشاء متغير نصي وذالك في طريقتين :
1 - Array of characters :
char Name[] = { 'A','l','i' };
ومن ثم نجمع هذه الحروف بواسطة انشاء كائن يختزن كل حروف المصفوفة داخل نص ثم بعدما اختزنت في نص سوف نسندها الى المتغير النصي ألي هو MyName
String MyName = new String(Name);
2 -String Varible :
String H;
H = "Hello Wolrd";
اول شي شنو هو String ?
بكل بساطة هو مجموعة من الأحرف متصلة مع بعضها البعض
مثل :
"Hello"
وهي بالأصل تكون بهذا الشكل
'h','e','l','l','o'
في معضم لغات البرمجة يكون string نوع بياني والذي يبنى كجزء من اللغة
ولهُ طريقتانِ لانشائه وهما :
1- Null Terminated : المنتهي بالعدم
حيث ان هذا التمثيل يكون بهذا الشكل :
char Src[] = {'h','e','l','l','o','\0 or $'};
ونلاحض في اخر هذه المصفوفة من الأحرف انها تنتهي بـما يسمى null
حيث انه رمز يمثل نهاية هذه السلسة وفائدته حتى يعلم المترجم compiler نهاية السلسة ويتوقف عندما يصل الى هذا الرمز
2- Pointer/Length : المؤشر والطول
حيث ان هذا التمثيل يكون بهذا الشكل :
String Name = "Ail";
حيث ان هنالك مؤشر في هذا التمثيل يؤشر على اول عنصر وهو A
وفي هذا التمثيل طول النص معروف لدى compiler
ويمكننا طباعة طول هذا النص عن طريق كتابة
System.out.print( Name.length() );
خلاصة الخلاصة :
عدنا تمثيلين للنص, التمثيل الأول النص عبارة عن مصفوفة من الأحرف , والثاني النص عبارة عن متغير من نوع نص بالأول ما يعرف المترجم نهاية المصفولة لذا يجب ان يمر بجميع الأحرف الى ان يصل الى \0 او $ حتى يتوقف , الثاني عدنا مؤشر ينضر الى اول حرف وعدنا الطول معلوم لذا يعرف المترجم متى يتوقف من دون ان في كل مرة يتحقق ويسأل وصلنه لو لا الطول معروف بعد ,
خلاصة خلاصة الخلاصة😂 :
Array of characters : char Name[] = { 'A','l','i' };
هنا المترجم ما يعرف طول المصفوفة
String DataType : String Name = "Ali";
هنا المترجم حاط عينه على اول حرف ويعرف طول المصفوفة
الخلاصة الكلية☠️ :
كل مصفوفة تنتهي دائما بnull Terminated (\0 or $ )
وكل متغير نصي طوله معروف وهناك مؤشر يؤشر على اول حرف في هذا النص
____________
زين ماذا يتعبر المتغير النصي في جافا؟؟؟؟
بكل بساطة هو كائن لديه خصائص حيث انهُ يمثل تسلسل من الحروف ,
حيث يمكن انشاء متغير نصي وذالك في طريقتين :
1 - Array of characters :
char Name[] = { 'A','l','i' };
ومن ثم نجمع هذه الحروف بواسطة انشاء كائن يختزن كل حروف المصفوفة داخل نص ثم بعدما اختزنت في نص سوف نسندها الى المتغير النصي ألي هو MyName
String MyName = new String(Name);
2 -String Varible :
String H;
H = "Hello Wolrd";
Forwarded from عبدالحميد
عبدالحميد
خلاصة String : اول شي شنو هو String ? بكل بساطة هو مجموعة من الأحرف متصلة مع بعضها البعض مثل : "Hello" وهي بالأصل تكون بهذا الشكل 'h','e','l','l','o' في معضم لغات البرمجة يكون string نوع بياني والذي يبنى كجزء من اللغة ولهُ طريقتانِ لانشائه وهما : 1- Null…
مصطلاحت عن المتغير النصي وطرق انشائه :
1- String literal :
هو نص محاط بعلامات اقتباس مزدوجة، مثل "Hello".
يتم تخزينه في String Constant Pool، مما يتيح للمترجم إدارة الذاكرة بكفاءة.
شنو هو String constant pool بكل اختصار هو مكان مخصص في الذاكرة لخزين النصوص
كيف يتعامل المترجم مع النصوص؟ راح اشرح فكرتها بهذا الشكل :
تخيل عندك مسبح، وهذا المسبح هو String Constant Pool في Java. حول المسبح توجد اليابسة، وهي منطقة الذاكرة الأوسع التي تُسمى Heap.
الآن، عندنا شخصين:
أحمد ويمثل متغير نصي.
محمد ويمثل متغير نصي آخر.
أحمد ومحمد يريدان السباحة في نفس المسبح، ورغم أن أسماؤهم مختلفة، لكنهم يشتركون في نفس المسبح
في Java، إذا كان لديك متغيرين يحملان نفس النص (مثل "Hello"):
String s1 = "Hello";
String s2 = "Hello";
- المترجم لن يقوم بإنشاء كائنين منفصلين لكل نص.
- بل سيقوم بوضع النص "Hello" في String Constant Pool، ويجعل كل من أحمد ومحمد (أي s1 و s2) يشتركان في نفس الكائن الموجود في المسبح.
بمعنى آخر، حتى لو كانت أسماؤهم مختلفة، فإنهم يستخدمون نفس النص داخل الذاكرة مما يوفر المساحة ويمنع تكرار الكائنات المتطابقة.
خلاصة :
إذا كان لدينا نصوص متطابقة في Java، سيتم تخزينها مرة واحدة فقط في المسبح، وكل المتغيرات التي تحمل نفس القيمة ستشير إلى نفس النص، حتى لو كانت أسماء المتغيرات مختلفة.
خلاصة الخلاصة :
عندما يتم انشاء متغيرات نصية ولهم نفس النص كقيمة كيف سَيتعامل معهم الcompiler?
وذالك عن طريق عدة خطوات :
الأوى :
المترجم يتحقق من المسبح النصي string constant pool في الذاكرة
هل نصوص المتغرات متطابقة؟
اذا كان الجواب بنعم.
فسوف يجعل هذه المتغيرات من النوع النصي والتي تحتوي على نفس النص سَيجعلهم كلهم يشيرون على نص واحد في الذاكرة RAM وذالك عن طريق العنوان address
اذا كان الجواب بِلا
فلن يفعل شيء.
خلاصة خلاصة الخلاصة 😭 :
لفترض سويت متغير نصي وخليت داخله نص
اول شي راح يسويه المترجم يروح يشوف اكو متغير نصي اخر بنفس نص هذا المتغير في البرنامج
اذا ماكو فراح يسوي كيان خاص لهذا المتغير في مسبح النصوص في الذاكرة ويضع بداخله نص هذا المتغير ويكدر يوصل المترجم لهذا النص ويتعامل مع عن طريق الaddress
لنفترض سويت متغير نصي اخر ووضع بداخله نفس النص المتغير الأول شنو راح يصير؟
فراح المترجم يأخذ عنوان او address ويربطه بالمتغير النصي الأخر
ولن ينشئ كان جديد في مسبح النصوص في الذاكرة
زين ليش ما كل مرة من نسوي متغير نصي ما يسوي كائن او حيز جديد في الذاكرة للمتغير الجديد؟
وذالك لجعل الذاكرة اكثر كفائة تخيل معي برنامج مال جوازات كمية الناس المتشابه اسمائهم كل مرة لازم اخلي مكان الهم بالذاكرة وهذا يحتاج سعات ضخمة جدا! وبتالي كفائة اقل لهذا السبب اخترعوا المهندسين والمبرمجين هذه الأفكار حتى نتعامل مع الذاكرة بشكل عقلاني وواقعي ولتقليل الكلفات المادية وزيادة السرعة والأستجابة في الحاسوب
1- String literal :
هو نص محاط بعلامات اقتباس مزدوجة، مثل "Hello".
يتم تخزينه في String Constant Pool، مما يتيح للمترجم إدارة الذاكرة بكفاءة.
شنو هو String constant pool بكل اختصار هو مكان مخصص في الذاكرة لخزين النصوص
كيف يتعامل المترجم مع النصوص؟ راح اشرح فكرتها بهذا الشكل :
تخيل عندك مسبح، وهذا المسبح هو String Constant Pool في Java. حول المسبح توجد اليابسة، وهي منطقة الذاكرة الأوسع التي تُسمى Heap.
الآن، عندنا شخصين:
أحمد ويمثل متغير نصي.
محمد ويمثل متغير نصي آخر.
أحمد ومحمد يريدان السباحة في نفس المسبح، ورغم أن أسماؤهم مختلفة، لكنهم يشتركون في نفس المسبح
في Java، إذا كان لديك متغيرين يحملان نفس النص (مثل "Hello"):
String s1 = "Hello";
String s2 = "Hello";
- المترجم لن يقوم بإنشاء كائنين منفصلين لكل نص.
- بل سيقوم بوضع النص "Hello" في String Constant Pool، ويجعل كل من أحمد ومحمد (أي s1 و s2) يشتركان في نفس الكائن الموجود في المسبح.
بمعنى آخر، حتى لو كانت أسماؤهم مختلفة، فإنهم يستخدمون نفس النص داخل الذاكرة مما يوفر المساحة ويمنع تكرار الكائنات المتطابقة.
خلاصة :
إذا كان لدينا نصوص متطابقة في Java، سيتم تخزينها مرة واحدة فقط في المسبح، وكل المتغيرات التي تحمل نفس القيمة ستشير إلى نفس النص، حتى لو كانت أسماء المتغيرات مختلفة.
خلاصة الخلاصة :
عندما يتم انشاء متغيرات نصية ولهم نفس النص كقيمة كيف سَيتعامل معهم الcompiler?
وذالك عن طريق عدة خطوات :
الأوى :
المترجم يتحقق من المسبح النصي string constant pool في الذاكرة
هل نصوص المتغرات متطابقة؟
اذا كان الجواب بنعم.
فسوف يجعل هذه المتغيرات من النوع النصي والتي تحتوي على نفس النص سَيجعلهم كلهم يشيرون على نص واحد في الذاكرة RAM وذالك عن طريق العنوان address
اذا كان الجواب بِلا
فلن يفعل شيء.
خلاصة خلاصة الخلاصة 😭 :
لفترض سويت متغير نصي وخليت داخله نص
اول شي راح يسويه المترجم يروح يشوف اكو متغير نصي اخر بنفس نص هذا المتغير في البرنامج
اذا ماكو فراح يسوي كيان خاص لهذا المتغير في مسبح النصوص في الذاكرة ويضع بداخله نص هذا المتغير ويكدر يوصل المترجم لهذا النص ويتعامل مع عن طريق الaddress
لنفترض سويت متغير نصي اخر ووضع بداخله نفس النص المتغير الأول شنو راح يصير؟
فراح المترجم يأخذ عنوان او address ويربطه بالمتغير النصي الأخر
ولن ينشئ كان جديد في مسبح النصوص في الذاكرة
زين ليش ما كل مرة من نسوي متغير نصي ما يسوي كائن او حيز جديد في الذاكرة للمتغير الجديد؟
وذالك لجعل الذاكرة اكثر كفائة تخيل معي برنامج مال جوازات كمية الناس المتشابه اسمائهم كل مرة لازم اخلي مكان الهم بالذاكرة وهذا يحتاج سعات ضخمة جدا! وبتالي كفائة اقل لهذا السبب اخترعوا المهندسين والمبرمجين هذه الأفكار حتى نتعامل مع الذاكرة بشكل عقلاني وواقعي ولتقليل الكلفات المادية وزيادة السرعة والأستجابة في الحاسوب