/Java Programming : Let’s Master 9/iii

Java Programming : Let’s Master 9/iii

النهاردا معادنا نكمل شابتر 9 ونتكلم عن بعض مفاهيم ال OOP في الجافا.. زي الCasting of Objects

9.8. Casting Objects and the instanceof Operator

احنا قبل كده استخدمنا الـ casting علشان اغير نوع المتغير مؤقتا لسبب ما..  كمان نقدر نستخدمه برده مع الـ objects بنفس الطريقة زي كده:

m(new Student());

الجملة دي مكافئة بالظبط لدي:

Object o = new Student(); // Implicit casting
m(o);

في جملة Object o= new Student(); عملنا casting وعادي مش هيحصل حاجة لأن اصلا كلاس Student هو subclass من كلاس Object وده الشرط الوحيد علشان نقدر نعمل Casting للـ objects .
لو جينا نقول حاجة زي دي:

Student b = o;

هنا هيحصل error ياتري ليه مع اننا لسه عاملين العكس واشتغل تمام؟؟
لأن زي ماقولنا الـ subclass جزء من الـ superclass وليس العكس بمعني ان كلاس Student جزء من كلاس  Object ولكن العكس مش صحيح فطبيعي ان الـ compiler يعترض. علشان نصلح غلط زي ده هنعمل casting كده :

Student b = (Student)o; // Explicit casting

ونطلع من المثالين دول بدرس لو عاوزين نعمل casting من كلاس ابن لكلاس اب مفيهاش اي مشكلة لأننا متفقين انه جزء من الكلاس الأب ولكن العكس مش هينفع بالطريقة دي فنضطر نستخدم الـ explicit casting يعني لازم احنا اللي نحدد اسم الكلاس.
نراعي اننا لازم نتأكد ان الـ object بينتمي فعلا لكلاس extends من الكلاس الأب علشان لو الكلاس مكانش جزء من الكلاس الأب هيتولد ClassCastException ولحل المشكلة دي نقدر نستخدم كلمة instanceof علشان نتأكد فعلا ان الـ object بينتمي للكلاس المطلوب ولا لأ زي كده :

Object myObject = new Circle();
... // Some lines of code
/** Perform casting if myObject is an instance of Circle */
if (myObject instanceof Circle) {
  System.out.println("The circle diameter is " +
    ((Circle)myObject).getDiameter());
  ...
}

اذا.. كلمة instanceof  بتستخدم عشان نعرف بيها هل الأوبجكت الفلاني بينتمي للكلاس دا ولا لأ..
يعني بييجي قبلها اسم أوبجكت و بعدها اسم كلاس.. لو الأوبجكت دا بينتمي للكلاس دا بترجع True  ولو لأ بترجع  False..

[divider]

9.8.1. Example: Demonstrating Polymorphism and Casting

ده مثال علي الـ polymorphism والـ casting بيعمل اتنين objects من نوع لدايرة والمستطيل وبينفذ ميثود displayObject اللي بتعرض مساحة وطول القطر الشكل لو كان دايرة والمساحة بس لو الشكل مستطيل :
المثال دا يا جماعة تطبيق هايل على instanceof .. نلاحظ ان نفس الميثود بتنادي على اتنين أوبجكت.. واحد من النوع دا ئرة والتاني مستطيل.. لكن استجابة الميثود لكل نوع منهم مختلفة..
طب هي بتعرف هل الأوبجكت دا دايرة ولا مستطيل منين؟؟
هنلاقي في سطر رقم17 بنقول للـ compiler افحص الأوبجكت دا.. لو لقيته بينتمي للنوع دائرة.. اطبع المساحة وطول القطر.. ولو بينتمي للنوع مستطيل.. اطبع المساحة بس..

  package chapter9;

  public class TestPolymorphismCasting {
    /** Main method */
    public static void main(String[] args) {
      // Declare and initialize two objects
      Object object1 = new Circle(1);
      Object object2 = new Rectangle(1, 1);

      // Display circle and rectangle
      displayObject(object1);
      displayObject(object2);
    }

    /** A method for displaying an object */
    public static void displayObject(Object object) {
      if (object instanceof Circle) {
        System.out.println("The circle area is " +
          ((Circle)object).getArea());
        System.out.println("The circle diameter is " +
          ((Circle)object).getDiameter());
      }
      else if (object instanceof Rectangle) {
        System.out.println("The rectangle area is " +
          ((Rectangle)object).getArea());
      }
    }
  }

[frame src=”http://blog.catreloaded.org/wp-content/uploads/2012/11/1.png” width=”375″ height=”129″ lightbox=”on” title=”Java Programming” align=”middle” ]

ملحوظة:: في معظم الأوقات بيكون استخدام كلمة instanceof داخل implementation الميثودز زي الطريقة اللي شوفتوها دي.. وبتكون مفيدة جدا عشان نحكم سلوك الميثود في التعامل مع الأنواع المختلفة من الأوبجكتس..

هنلاقي ان ميثود displayObject مثال علي الـ generic programming لأننا نقدر نناديها بـ object من اي نوع . في الأول عملنا implicit casting لأتنين objects من نوع Circle و Rectangle وبعدين نادي علي ميثود displayObject لطباعة صفات الشكلين .وداخل الميثود استخدمنا كلمة instanceof علشان نختبر هل الـ object ده بينتمي لكلاس الدايرة ولا المستطيل .
ملحوظة :: عند عمل casting يراعي وضع اسم الكلاس اللي بيتم الـ casting ليه بين قوسين.
[divider]

9.9. The ArrayList Class

في الجزء دا الكتاب بادئ يتكلم عن حاجة مهمة جدا في الجافا.. وهي الArrayLists ..
احنا قبل كده اتعرفنا علي الـ array وعرفنا اننا نقدر نخزن فيه اكتر من object من نفس النوع ولكن كانت المشكلة ان عدد المتغيرات فيه كان عدد ثابت ولازم نحدده قبل اي عملية اعملها عليه , هنا هنتعرف علي الـ arrayList وهي زي الـ array بالظبط ولكن بتديني إمكانية تخزين عدد غير محدود من المتغيرات بداخلها .
مش بس كده.. الArrayList أكثر مرونة من الArray العادي.. بتسمحلي أضيف عناصر وأحذف عناصر منها.. يعني من الأخر السعة بتاعتها ديناميكية متغيرة على عكس الArray العادي..
حد هيقولي طب مانا ممكن أحذف حاجة من الArray كده مثلا:

arrayName[4] = null; 

طبعا الكلام دا مش مظبوط.. انت كده مش حذفت حاجة.. انت خليت قيمة الindex  دا أو العنصر دا بتساوي null .. لكن هو مازال موجود وليه رقم تسلسلي داخل الArray.. لكن لما بتحذف عنصر من الArrayList بيتحذف تماما من الReferemce وبيحصل ازاحة للعنصر اللي بعده عشان يحل محله..
في الUML اللي جاي دا أهم الميثودز الموجودة في كلاس ArrayList الخاصة بالتعامل مع أي arrayList..

[frame src=”http://blog.catreloaded.org/wp-content/uploads/2012/11/2.png” width=”375″ height=”175″ lightbox=”on” title=”Java Programming” align=”middle” ]

وهنا عندنا مثال بيعمل arrayList وبيخزن فيها بعض الـ objects وبيعمل عليها بعض العمليات :
وفي المثال دا.. تطبيق على معظم الميثودز دي.. arrayList اسمها cityList وبنضيف جواها مدن ونحذف مدن..
الإضافة كمان ممكن تكون Append و ممكن تكون insert في النص..

[frame src=”http://blog.catreloaded.org/wp-content/uploads/2012/11/3.png” width=”375″ height=”136″ lightbox=”on” title=”Java Programming” align=”middle” ]

public class TestArrayList {
    public static void main(String[] args) {
      // Create a list to store cities
      java.util.ArrayList cityList = new java.util.ArrayList();

      // Add some cities in the list
      cityList.add("London");
      // cityList now contains [London]
      cityList.add("New York");
      // cityList now contains [London, New York]
      cityList.add("Paris");
      // cityList now contains [London, New York, Paris]
      cityList.add("Toronto");
      // cityList now contains [London, New York, Paris, Toronto]
      cityList.add("Hong Kong");
      // contains [London, New York, Paris, Toronto, Hong Kong]
      cityList.add("Singapore");
      // contains [London, New York, Paris, Toronto,
      //             Hong Kong, Singapore]

      System.out.println("List size? " + cityList.size());
      System.out.println("Is Toronto in the list? " +
        cityList.contains("Toronto"));
      System.out.println("The location of New York in the list? "
        + cityList.indexOf("New York"));
      System.out.println("Is the list empty? " +
        cityList.isEmpty()); // Print false

      // Insert a new city at index 2
      cityList.add(2, "Beijing");
      // contains [London, New York, Beijing, Paris, Toronto,
      //             Hong Kong, Singapore]

      // Remove a city from the list
      cityList.remove("Toronto");
      // contains [London, New York, Beijing, Paris,
      //             Hong Kong, Singapore]

      // Remove a city at index 1
      cityList.remove(1);
      // contains [London, Beijing, Paris, Hong Kong, Singapore]

      // Display London Beijing Paris Hong Kong Singapore
      for (int i = 0; i < cityList.size(); i++)
        System.out.print(cityList.get(i) + " ");
      System.out.println();

      // Create a list to store two circles
      java.util.ArrayList list = new java.util.ArrayList();

      // Add two circles
      list.add(new Circle(2));
      list.add(new Circle(3));

      // Display the area of the first circle in the list
      System.out.println("The area of the circle? " +
        ((Circle)list.get(0)).getArea());
    }
  }

ده جدول فيه الفروق بين الـ arrayList والـ array :

[frame src=”http://blog.catreloaded.org/wp-content/uploads/2012/11/4.png” width=”375″ height=”251″ lightbox=”on” title=”Java Programming” align=”middle” ]

[divider]

لحد هنا بنكون خلصنا النهاردا.. ومعادنا الجاي انشاء الله هيكون أخر جزء في شابتر 9..

It’s totally free to share and copy
Thanks, CATreloaded..
Thanks, CATaZine..
@Om4rezz

I'm Omar Ezz Ed-Dien, Software Engineer - Java developer. #Java is such a way of thinking :-)