اذهب إلى المحتوى

qusayabomal3aqa

الأعضاء
  • المساهمات

    17
  • تاريخ الانضمام

  • تاريخ آخر زيارة

آخر الزوار

لوحة آخر الزوار معطلة ولن تظهر للأعضاء

إنجازات qusayabomal3aqa

عضو مساهم

عضو مساهم (2/3)

4

السمعة بالموقع

2

إجابات الأسئلة

  1. الاستثناء هو مشكلة يمكن أن تحدث أثناء التدفق الطبيعي للتنفيذ. يمكن للطريقة طرح استثناء عندما يبكي شيء ما في وقت التشغيل. إذا تعذر معالجة هذا الاستثناء ، فسيتم إنهاء التنفيذ قبل إكمال المهمة.إذا تعاملنا مع الاستثناء ، فسيستمر التدفق الطبيعي. الاستثناءات هي فئة فرعية من java.lang.Exception. مثال للتعامل مع الاستثناء: try{ // هنا نضع الكود الذي من الممكن ان يحدث به خطأ }catch(Exception e){ // هنا يتم امساك الخط الذي حصل } انواع الاستثناءات: أ) استثناء محدد: يتم فحص هذه الاستثناءات من قبل المترجم في وقت التجميع. تسمى الفئات التي توسع فئة Throwable باستثناء استثناء وقت التشغيل والخطأ "استثناء محدد". يجب أن تعلن الاستثناءات المحددة عن الاستثناء باستخدام كلمة رئيسية محاطة بمحاولة / التقاط مناسبة.على سبيل المثال ، استثناء ClassNotFound ب) استثناء لم يتم التحقق منه: لم يتم فحص هذه الاستثناءات أثناء وقت الترجمة من قبل المترجم. لا يجبر المترجم على التعامل مع هذه الاستثناءات. مثل: الاستثناء الحسابي
  2. سؤالك مثير للاهتمام، اسمحوا لي أن أبدأ بمثال فشل في بناء الكائن. class A { private String a = "A"; public A() throws Exception { throw new Exception(); } } الآن ، لنفترض أننا نود إنشاء كائن من النوع A في كتلة try ... catch. A a = null; try{ a = new A(); }catch(Exception e) { //... } System.out.println(a); من الواضح أن ناتج هذا سيكون: null. لماذا لا تقوم Java بإرجاع كائن من A؟ بعد كل شيء ، عند نقطة فشل البناء، تم بالفعل تهيئة حقل اسم الكائن ، أليس كذلك؟ حسنًا ، لا يمكن لـ Java إرجاع كائن من A لأنه لم يتم إنشاء الكائن بنجاح. الكائن في حالة غير مستقرة، وبالتالي يتم تجاهله بواسطة Java. لم تتم تهيئة المتغير A الخاص بك ، بل يتم الاحتفاظ به على أنه فارغ. الآن ، كما تعلم ، لبناء كائن جديد بالكامل ، يجب تهيئة جميع فئاته أولاً. إذا فشلت إحدى الفئات في التنفيذ ، فما هي الحالة النهائية للكائن؟ من المستحيل تحديد ذلك. انظر إلى هذا المثال الأكثر تفصيلاً class A { private final int a; public A() throws Exception { a = 10; } } class B extends A { private final int b; public B() throws Exception { methodThatThrowsException(); b = 20; } } class C extends B { public C() throws Exception { super(); } } عندما يتم استدعاء مُنشئ C ، إذا حدث استثناء أثناء تهيئة B ، فما قيمة المتغير النهائي int b؟ على هذا النحو ، لا يمكن إنشاء الكائن C ، فهو مزيف ، إنه سلة مهملات ، ولم تتم تهيئته بالكامل. بالنسبة لي ، هذا يفسر سبب كون الرمز الخاص بك غير قانوني.
  3. هناك طرق مختلفة (وفعالة) للقيام بذلك. لكن مع الالتزام الصارم بالكود واستخدام المصفوفة ، أود أن أقترح شيئًا من هذا القبيل. أولاً احسب عدد مرات التكرار، ثم أنشئ مصفوفة أخرى حيث ستخزن باقي الأرقام. ثم لديك مصفوفة أخرى حيث تقوم بالتكرار خلال المصفوفة الأولى ، وإذا لم تتطابق مع الرقم الذي تحاول إزالته ، فقم ببساطة بإضافته إلى المصفوفة الجديدة. int[] arr1 = {5,122,1,44,1,6,4,1,33,1,89,1,225,162,1,1,1,75,11,1,1,1}; int remove = 1; int occurences =0, counter=0; for(int i = 0; i < arr1.length ; i++) { if(remove == arr1[i]) { occurences++; } } int[] subArray = new int[arr1.length - occurences]; for(int i = 0; i < arr1.length ; i++) { if(remove != arr1[i]) { subArray[counter++] = arr1[i]; } } for(int i=0; i< subArray.length; i++){ System.out.print(subArray[i] + " "); }
  4. ببساطة ، يعتمد ذلك على سبب انتظار سلاسل الرسائل الخاصة بك. هل تريد أن تخبر أحد سلاسل الرسائل المنتظرة أن شيئًا ما قد حدث ، أم أنك تريد أن تخبرهم جميعًا في نفس الوقت؟ في بعض الحالات ، يمكن لجميع سلاسل انتظار الانتظار اتخاذ إجراء مفيد بمجرد انتهاء الانتظار. مثال على ذلك هو مجموعة من مؤشرات الترابط في انتظار انتهاء مهمة معينة ؛ بمجرد انتهاء المهمة ، يمكن لجميع خيوط الانتظار متابعة أعمالهم. في مثل هذه الحالة ، يمكنك استخدام notifyAll () لاستيقاظ جميع سلاسل انتظار الانتظار في نفس الوقت. حالة أخرى ، على سبيل المثال قفل متبادل ، يمكن لواحد فقط من خيوط الانتظار أن تفعل شيئًا مفيدًا بعد أن يتم إعلامك (في هذه الحالة تحصل على القفل). في مثل هذه الحالة ، تفضل استخدام الإخطار () . تم التنفيذ بشكل صحيح ، يمكنك استخدام notifyAll () في هذه الحالة أيضًا ، لكنك ستستيقظ دون داع سلاسل الرسائل التي لا تستطيع فعل أي شيء على أي حال. في كثير من الحالات ، سيتم كتابة الشفرة التي تنتظر الشرط كحلقة: synchronized(o) { while (! IsConditionTrue()) { o.wait(); } DoSomethingThatOnlyMakesSenseWhenConditionIsTrue_and_MaybeMakeConditionFalseAgain(); } وبهذه الطريقة ، إذا استدعت مكالمة o.notifyAll() أكثر من خيط انتظار واحد ، وأول من يُرجع من o.wait() يجعل الحالة في الحالة الخاطئة ، فإن الآخر ستعود المواضيع التي تم إيقاظها إلى الانتظار.
  5. الطريقة التي جاءت على بالي هي: System.setOut(new PrintStream(new ByteArrayOutputStream() { @Override public void flush() throws IOException { super.flush(); String old = Preferences.userRoot().node("app").get("stdout", ""); Preferences.userRoot().node("app").put("stdout", old + toString(StandardCharsets.UTF_8)); count = 0; } }, true, StandardCharsets.UTF_8)); يؤدي هذا إلى إنشاء PrintStream. سيتم مسح PrintStream تلقائيًا عند طباعة حرف سطر جديد (على سبيل المثال باستخدام println). سيؤدي هذا إلى تدفق ByteArrayOutputStream.
  6. يمكننا إيقاف thread باستخدام ثلاث طرق : Sleeping Waiting Blocked sleep تستخدم لتأخير تنفيذ thread لبعض الوقت فقط. مثال: Thread. Sleep (2000) // ياخير الثريد 2 ملي من الثاينة public class ExampleThread implements Runnable{ public static void main (String[] args){ Thread t = new Thread (); t.start (); } public void run(){ try{ Thread.sleep(2000); }catch(InterruptedException e){ } } هذا مثال بسيط يوضح لك استخدام الدالة sleep
  7. هناك طريقتان متاحتان لعمل الثريد. الطريقة الأولى هي انك تعمل وراثة لكلاس Thread. يحتوي كلاس Thread على العديد من الدوال التي تسمح لنا بإجراء عمليات مختلفة على مؤشر الترابط. فئة الكائن تطبق الواجهة Runnable. تحتوي فئة مؤشر الترابط على المُنشئات التالية التي تُستخدم لإجراء عمليات متنوعة. مثال: // تنفيذ الواجهة عن طريق كلاس الثريد public class ThreadExample1 extends Thread { // هذه الدالة من اجل تشغيل الثريد public void run() { int a= 10; int b=12; int result = a+b; System.out.println("Thread started running.."); System.out.println("Sum of two numbers is: "+ result); } public static void main( String args[] ) { // هنا انشاء كائن للكلاس ثريد ThreadExample1 t1 = new ThreadExample1(); // هنا استدعاء دالة التنفيذ لتشغيل الثريد t1.start(); // ويكون ناتج التنفيذ 22 } } الطريقة الثانية هي تنفيذ واجهة التشغيل. دعنا نأخذ مثالاً لفهم كيف يمكننا إنشاء وبدء وتشغيل Thread باستخدام الواجهة القابلة للتشغيل. public class Main implements Runnable { public void run() { // نفس الدالة الموجودة في المثال السابق System.out.println("This code is running in a thread"); } } public class Main implements Runnable { public static void main(String[] args) { Main obj = new Main(); Thread thread = new Thread(obj); // تمرير الكائن الى الثريد thread.start(); System.out.println("وهنا بداية الثريد"); } public void run() { System.out.println("تشغيل الثريد"); } }
  8. الجواب ان تعدد الأشكال يعني العديد من الأشكال. تعدد الأشكال يسمح لكائن بالتصرف بطرق متعددة. انظر الى المثال التالي Public class Manipulation(){ //كلا الاب public void add(){ } } public class Addition extends Manipulation(){ // كلاس الابن public void add(){ } public static void main(String args[]){ Manipulation addition = new Addition(); // انشأنا كائن من الكلاس الابن ورجعناه من نوع الاب addition.add(); // عند استدعاء هذه الدالة يتجاوز دالة الاب ويستدعي دالة الابن } }
  9. الغرض من التغليف: يحمي الكود من الآخرين. قابلية صيانة الكود. مثال: public class Addition(){ int age=5; // هذا المتغير لا يمكن ان يكون سالب، لانه لا يوجد عمر بالسالب } إذا قام شخص ما بتغيير المتغير إلى 5- فهو غير واقعي. للتغلب على المشكلة نحتاج إلى اتباع الخطوات التالية: يمكننا جعل المتغير خاصًا أو محميًا. بحيث يمكن تعديل الكود أعلاه على النحو التالي: public class Addition(){ private int a = 5; // هنا يتم تمييز المتغير على أنه خاص // Setter public integer setAge(int a){ if(a > 0){// هنا يتم تطبيق الشرط ونضمن ان لا تكون قيمة المتغير سالبة $this.a = a; } } // Getter public integer getAge() { // هذه الدالة للوصول الى المتغير لانك لا تستطيع الوصول له مباشرة لانه محمي return a; } } للتغليف ، نحتاج إلى جعل جميع متغيرات الصنف خاصة وإنشاء دالة ادخال القيمة للمتغير ودالة للوصول الى المتغير. وهذا بدوره سيجبر الآخرين على الاتصال بالدوال بدلاً من الوصول إلى البيانات مباشرة.
  10. الفرق الرئيسي: تعتبر الواجهة أو البروتوكول طريقة شائعة تسمح للكائنات غير المرتبطة بالتواصل مع بعضها البعض. وهو يمثل سلوكًا متفقًا يسهل التفاعل بين الجسمين. فئة مجردة هي فئة من الكائنات التي لا يمكن إنشاء مثيل أو إعداد مثيل لكائن. قد لا يكون لهذه الفئة أي تطبيق أو يمكن أن يكون لها تنفيذ غير مكتمل. هي طريقة خاصة: لها تصريح فقط ، ولكن لا يوجد تنفيذ ملموس. مثال: الكلاس المجرد يحتوي على دوال مجردة ودوال غير مجردة public abstract class ClassName { abstract void fun(); // دالة مجردة void close() { //.... دالة غير مجردة، لها محتوى } } أما المواجهة تشير عمومًا إلى طرق أو وظائف يمكن للآخرين الاتصال بها. وتحتوي فقط على دوال مجردة public interface InterfaceName { // تكون كل الدوال فيها مجردة public abstract void open(); public abstract void close(); }
  11. لتقليل التعقيد وتبسيط اللغة ، لا يتم دعم الوراثة المتعددة في جافا. ضع في اعتبارك سيناريو حيث A و B و C عبارة عن ثلاث فئات. ترث الفئة C الفئتين A و B. إذا كان للفئات A و B نفس الدوال وقمت باستدعائها من كائن فئة فرعية ، فسيكون هناك غموض لاستدعاء طريقة الفئة A أو B. انظر الى هذا المثال وهو مثال خاطئ في لغة جافا class A{ void msg(){ System.out.println("Hello"); } } class B{ void msg(){ System.out.println("Welcome"); } } class C extends A,B{ public static void main(String args[]){ C obj=new C(); obj.msg(); // هنا سيتم استدعاء الدالة من اي صنف ؟ } } وهنا يحدث خطأ Compile Time Error نظرًا لأن أخطاء وقت الترجمة أفضل من أخطاء وقت التشغيل ، فإن Java تعرض خطأ وقت الترجمة إذا ورثت فئتين. لذلك سواء كان لديك نفس الطريقة أو مختلفة ، سيكون هناك خطأ في وقت التجميع.
  12. كلمة static مهمة ورائعة جداً فيما يتعلق بالذاكرة، فهي تساعد المبرمج على إنشاء نظام فعال في إستخدام الذاكرة، أي يقلل من إستخدام الذاكرة. و ذلك لأن كل متغير أو دالة أو غيره تم تعريفه بأنه static فذلك يعني أن هذا المتغير سيتم حجز مكانه في الذاكرة لمرة واحدة فقط. يعني في مثالك الاول في كل مرة تنشأ فيها كائن من الصنف يحجز قيمة جديدة للمتغير count عند انشاء المتغير الاول count = 0 صحيح ويزيد واحد، وعند انشاء الكائن الثاني يحجز مكان جديد للمتغير count وتكون قيمته ايضاً صفر ويزيد واحد وهكذا اما في المثال الثاني فالمتغير count static ومعنى static هنا انه يتم حجز المتغير count مرة واحدة فقط، فعند انشاء اول كائن من الصنف تكون قيمة المتغير count تساوي صفر وتزيد واحد فيصبح count=1 وعند انشاء الكائن الثاني لا يحجز مكان جديد في الذاكرة للمتغير count بل يأخذ القيمة المحجوزة مسبقاً فتصبح قيمة المتغير count = 2 وهكذا اتمنى ان اكون قد وفقت في الاجابة على سؤالك
  13. هناك العديد من الاختلافات بين الدوال والباني. أولاً: الباني - يكون اسم الباني مطابقًا لاسم الفئة. - يُستخدم الباني لتهيئة حالة الكائن. - يوفر مترجم Java باني افتراضيًا إذا لم يكن لديك أي باني في الكلاس. باني فارغ لكي تستطيع إنشاء كائن من الصنف. - اول ما تنشأ كائن يتم استدعاء الباني تلقائياً. -- الباني دالة بنفس اسم الكلاس. اعطيك مثال على الباني : //هذا مثال يوضح لك ما هي اهمية البناء في الصنف // يستخدم البناء لتهيئة المتغيرات للصنف class Student{ int id; String name; // هذا الباني يستخدم لتهئية العدد الصحيح والاسم Student(int i,String n){ id = i; name = n; } // هنا ملاحظة انه يمكن انشاء اكثر من بناء لنفس الصنف void display(){System.out.println(id+" "+name); } public static void main(String args[]){ Student s1 = new Student(125,"َQusay"); // عند انشاء هذا الكائن يتم تنفيذ البناء تلقائيا s1.display(); // استدعاء الدالة لعرض البيانات وهذا الفرق بين البناء والدوال، انه الدوال تحتاج الى استدعاء } } ثانياً: الدوال. - الدوال تستخدام للتعبيرعن سلوك الكائن. - الدوال لا يتم تنفيذها تلقائياً من قبل المترجم. - الدوال نوعان دوال ترجع قيمة ودوال لا ترجع قيمة. public class Main { // هذه دالة لا ترجع قيمة عند الاستدعاء يتم طباعة جملة الطباعة فقط static void hello() { System.out.println("مرحبا بك"); } // هذه الدالة ترجع قيمة المتغير x static void sum() { return int x = 5 + 5; } public static void main(String[] args) { hello(); // لا تحتاج الى جملة طباعة لانها لا ترجع قيمة System.out.println(sum()); // تحتاج الى جملة طباعة لطباعة القيمة التي في داخلها } }
  14. افضل طريقة تمكننا من إنشاء كائنات متعددة بنوع واحد فقط كما نفعل في حالة الأوليات. اعطيك مثال لكي يوضح لك الامر بدء المتغيرات البدائية: int a=10, b=20; تهيئة المتغيرات المرجعية(إنشاء الكائنات): Rectangle r1=new Rectangle(), r2=new Rectangle();//creating two objects دعنا نرى المثال: //Java Program to illustrate the use of Rectangle class which //has length and width data members class Rectangle{ int length; int width; void insert(int l,int w){ length=l; width=w; } void calculateArea(){System.out.println(length*width);} } class TestRectangle2{ public static void main(String args[]){ Rectangle r1=new Rectangle(),r2=new Rectangle();//creating two objects r1.insert(11,5); r2.insert(3,15); r1.calculateArea(); r2.calculateArea(); } } في هذا المثال انشأنا كلاس Rectangle يأخذ الطول والعرض ويحسب مساحة المستطيل وفي كلاس ال main انشأنا كائنين من كلاس Rectangle واستدعينا الدالة insert لكل كائن وحسبنا مساحة المستطيل الفكرة هي انشاء اكثر من كائن للكلاس Rectangle
  15. ArrayList ArrayList هو الخيار الأفضل إذا كانت عمليتنا المتكررة هي عملية الاسترجاع. ArrayList هو الخيار الأسوأ إذا كانت عمليتنا هي الإدراج والحذف في المنتصف لأنه يتم تنفيذ العديد من عمليات التحول داخليًا. سيتم تخزين العناصر في ArrayList في مواقع ذاكرة متتالية ومن ثم تصبح عملية الاسترجاع سهلة. LinkedList LinkedList هو الخيار الأفضل إذا كانت عمليتنا المتكررة هي الإدراج والحذف في المنتصف. LinkedList هو أسوأ خيار هو أن عمليتنا المتكررة هي عملية الاسترجاع. في LinkedList ، لن يتم تخزين العناصر في موقع ذاكرة متتالي ، وبالتالي ستكون عملية الاسترجاع معقدة. الان بالنسبة الى سؤالك نستخدم ArrayList اذا كانت عملية الاسترجاع غالبة على برنامجنا اما اذا كنت تريد الاضافة والحذف اكثر من طلب البيانات من المصفوفة يفضل استخدام LinkedList
×
×
  • أضف...