Reference Casting

Reference Casting

 

คือการแปลงชนิดของ reference ให้เป็นไปตามที่กำหนด ส่วนมากใช้ในการแปลงไปมาระหว่าง reference ของคลาสแม่และคลาสลูกโดยอาศัยกลไลของ polymorphism ตัวอย่างเช่น หากเรามีคลาสแม่ละคลาสลูก

 

public class Vehicle {  }

public class Car extends Vehicle {  }

Vehicle v;

Car c;

 

เราสามารถนำ reference ของคลาสแม่รับค่าของ reference คลาสลูกได้ (ตามกลไลของ polymorphism)

c = new Car( );

v = c ;           // OK

v = (vehicle) c   // OK

แต่ไม่สามารถนำ reference ของคลาสลูกไปรับ reference คลาสแม่ได้

c = v ;           // Error !

ยกเว้นเราจะทำการ casting เสียก่อน (คือเปลี่ยน reference ของคลาสแม่ให้กลายเป็นลูกชั่วคราว)

c = (car) v;      // compile OK

โดยมีเงื่อนไขว่าถ้า reference ของคลาสแม่ต้องชี้ไปยัง object ของคลาสลูก (ซึ่งในที่นี้ v ชี้ไปที่ Object Car อยู่แล้ว)

แต่ในกรณีที่ reference ของคลาสแม่ไม่ได้ชี้ไปยัง object ของคลาสลูกตัวนั้นจะคอมไพล์ผ่านแต่จะ error ตอนรัน เช่น

 

Vehicle v = new Car( );

Car c = (car) v;

Vehicle v = new Vehicle( );

Car c = (car) v;

Code A

Code B

 

Code A และ B จะคอมไพล์ผ่านทั้งคู่ แต่ Code B จะเกิด Error ตอนรันในขณะที่ Code A ทำงานเป็นปกติ เนื่องจากคอมไพเลอร์จะตรวจสอบตอนคอมไพล์เพียงแค่ว่าค่า reference ทางซ้ายและขวาเท่ากันหรือไม่ (นอกจากนี้ยังตรวจสอบว่ามีความสัมพันธ์เป็นคลาสแม่และลูกกันหรือไม่ หากไม่ใช่จะ Error ตอนคอมไพล์ทันที ) ซึ่งเมื่อทำ casting แล้วจะเท่ากัน แต่ในขณะรันโปรแกรมนั้นจะดูที่ชนิดของ Object ซึ่งเมื่อตรวจสอบแล้วพบว่า Code B นำ reference ของคลาส Car ชี้ไปที่วัตถุของคลาสอื่น(ซึ่งก็คือ Vehicle) ที่ไม่ใช่ของคลาสตัวเอง  ก็จะทำให้เกิด Error จนโปรแกรมหยุดทำงาน

 

Collection

คือกลุ่มของคลาสและ interface ที่ช่วยในการเก็บข้อมูลเป็นชุด ๆ คล้ายกับ array โดยจะยกตัวอย่างมาบางส่วนดังรูปด้านล่าง

ปกติ Collection จะใช้เก็บวัตถุแต่สามารถเก็บข้อมูลพื้นฐานได้หากมีการใช้คลาส Wrapper มาห่อข้อมูล แต่ในจาวา 5.0 จะทำการห่อให้อัตโนมัติเรียกว่า Auto-Boxing เช่น

 

Collection<Integer> col = new ArrayList<integer>();

col.add(new Integer(10)); // ถ้าในจาวาก่อน 5.0 ต้องเขียนแบบนี้

col.add(10);            // จาวา 5.0 ทำให้อัตโนมัติ

กลุ่มคลาสที่ implement Collection เฉพาะที่น่าสนใจมีดังนี้

 

1. Set

            จะเก็บวัตถุที่ไม่เหมือนกัน โดยหากใส่วัตถุที่เหมือนกันหลาย ๆ ค่าจะเก็บเพียงค่าเดียว

  • HashSet

สร้างจาก Hash Table ไม่มีการเรียงลำดับของวัตถุที่ใส่เข้ามาใน HashSet

  • LinkedHashSet

สร้างจาก Hash Table และโครงสร้างข้อมูลแบบ Linked-list สมาชิกที่อยู่ในนี้จะถูกเรียงตามลำดับก่อนหลังที่เพิ่มเข้ามา

  • TreeSet

สร้างจากโครงสร้างข้อมูลแบบ Tree ข้อมูลในนี้จะเรียงลำดับด้วยวิธีต่าง ๆ ตามที่ผู้ใช้กำหนด

2. List

            จะเก็บวัตถุเรียงกันเป็นรายการและมีลำดับ โดยวัตถุมีเข้ามาในลิสต์ก่อนจะวางไว้ข้างหน้า

  • ArrayList

ในจาวา 5.0 จะใช้เก็บวัตถุชนิดเดียวกันเท่านั้นเอาไว้ใน array ที่ไม่ต้องกำหนดขนาดเริ่มต้น โดยการเพิ่มหรือเอาสมาชิกออกจาก ArrayList จะทำให้อย่างอัตโนมัติผ่านเมธอดต่าง ๆ ที่ implement มาจาก Collection และ List

การใช้งาน            ArrayList<คลาสที่ต้องการเก็บ> เรฟเฟอร์เรนซ์ เช่น       

ArrayList<String> s;        // คือสามารถเก็บวัตถุของ String ได้เท่านั้น

                        str = new ArrayList<String>( );

      str.add(“Hello”);

      str.add(“World”);

            str.add(2.5);          // คอมไพล์ไม่ผ่านเนื่องจากใส่ค่าที่ไม่ใช่วัตถุ String

      str.remove(“Hello”);

      for(String s : str)

            {     System.out.println(s);  }  // พิมพ์ค่าที่อยู่ใน ArrayList ออกมา

 
อ้างอิงจาก เอกสารประกอบการเรียน วิชา Modern Programmin

กรุณา Comment สักหน่อยเถอะ จะได้ปรับปรุ่งให้ดีขึ้น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s