Java Inheritance

Inheritance คือ คุณสมบัติในการถ่ายทอด Code จาก Class หนึ่งๆให้กับ Class อื่นๆ กล่าวคือ เป็นการแชร์ Code ระหว่าง Class ที่มีลักษณะบางอย่างที่เหมือนกัน

ในการทำ Inheritance คลาสลูก(subclass) จะทำการสืบทอดจาก คลาสแม่(superclass)
ซึ่ง
Class ที่สืบทอดจาก Class อื่นๆ เราเรียกว่า คลาสลูก(subclass)
Class ที่ถูกสืบถอดจาก  Class อื่นๆ เราเรียกว่า คลาสแม่(superclass)

ในภาษา Java สนับสนุนการทำ Inheritance เพียง 3 รูปแบบ ดังนี้


เป็นการสืบทอดแบบ 1-1  
คลาสลูก สืบทอดจาก คลาสแม่ 


เป็นการสืบทอดแบบหลายระดับ
คลาสลูก(subclass) สามารถ เป็น คลาสแม่(superclass) ของ Class อื่นๆที่สืบมันต่ออีกทีหนึ่งได้


เป็นการสืบทอดแบบ 1-M 
คลาสแม่ สามารถมี คลาสลูก ได้หลาย คลาสลูก 
แต่ คลาสลูก จะมี คลาสแม่ ได้เพียง 1 เดียวเท่านั้น


การทำ Inheritance ใน Java เมื่อ คลาสลูก สืบทอดจาก คลาสแม่ 
field และ method ที่ระบุ Access Modifier protected และ public ทั้งหมดยกเว้น Constructor ของคลาสแม่ จะถูกถ่ายทอดให้กับ คลาสลูก 
field และ method ที่ระบุ Access Modifier default(package) และ private  ไม่ถูกถ่ายทอดให้คลาสลูก

การประกาศ Inheritance ทำได้โดยใช้ keyword ต่อจากชื่อ คลาสลูก ว่า "extends" ตาม ชื่อ คลาสแม่

ตัวอย่าง 


ตัวอย่าง code






จะเห็นได้ว่า Animal ที่เป็น คลาสแม่ จะมี Fields และ Method ที่ Cat และ Dog จำเป็นต้องมีเหมือนๆกันนี่แหละคือหัวใจของเรื่องนี้เลย เป็นการแชร์ Code ของ Animal ให้กับ Cat และ Dog ทำให้ไม่ต้องเขียน Code ซ้ำๆของทุกๆ Class ที่เหมือนๆกัน

ในบางคนอาจจะกล่าวเพื่อให้สมเหตุสมผลเป็นคำพูดเชิงตรรกะว่า Cat is a Animal และ Dog is a Animal

และอีกอย่างการทำ Inheritance นั้น คลาสลูก สามารถมี Fields และ Method เป็นของ Class ตัวเองได้

ตัวอย่าง code




ที่ควรจะรู้อีกอย่างคือ Final Classes ไม่สามารถสืบทอดได้นะ 


Overriding Methods

ใน คลาสลูก ที่ได้รับสืบทอด Methods มาจาก คลาสแม่ Methods เหล่านั้นสามารถกำหนดพฤติกรรมให้มันใหม่ได้ โดยการ Override Method นั้น จากนั้นมันจะทำให้ Method ที่ได้สืบถอดมาจาก คลาสแม่เดิมนั้นถูกละเว้นไป

การทำ Overriding นั้น Method ต้องมีชื่อเดียวกัน Type เดียวกันลำดับ Parameter เดียวกันเหมือนกันเป๊ๆ(ยกเว้นใน Body) กับที่ได้รับมาจาก คลาสแม่ เท่านั้น มิฉะนั้นจะไม่ใช่การ Overriding แต่จะเป็นการสร้าง Method ใหม่ของ Class นั้นๆแทน

ตัวอย่าง code




หมายเหตุ : Annotation @Override ที่เห็นในตัวอย่างข้างบนนี้ ทำไมต้องใส่? ใส่เพื่อ? เหตุผลที่แนะนำให้ใส่ทุกครั้ง เพราะ ถ้าคุณตั้งใจจะ Override และใส่ชื่อผิด,Typeผิด หรือ Parameterผิดไม่ตรงตามเงื่นไขของการ Override มันจะช่วยแจ้ง Error ให้คุณรู้ทันที แต่ถ้าคุณไม่ใส่ @Override มันจะไม่แจ้งให้คุณทราบและไม่เกิด Error ด้วย มันจะถือว่าเป็น Method สร้างใหม่


Calling SuperClass Method

Method ของ คลาสแม่ที่ถูกถ่ายทอดมาให้คลาสลูกนั้นจะลูกละเว้นไม่ได้ทำงานก็ต่อเมื่อคลาสลูก Override Method ดังกล่าว แต่เรายังสามารถเรียก Method เดิมของคลาสแม่มาทำงานในคลาสลูกได้อยู่
โดยใช้ keyword super ซึ่งคำสั่ง super เป็นการเข้าถึงสมาชิกของ คลาสแม่ นั่นหมายความว่าเราสามารถเข้าถึง field และ method ของคลาสแม่ได้ผ่านคำสั่ง super 

ตัวอย่าง code






อนึ่ง keyword super ยังสามารถเรียกทำงานใน Method อื่นๆ ที่สร้างใหม่ของคลาสลูกได้อีกด้วย

ที่ควรจะรู้อีกอย่างคือ Final Method ไม่สามารถ Override ได้ 

Fields ไม่สามารถ Override ได้ อันนี้ก็จำไว้ หากเราสร้าง Fields ของคลาสลูกที่มีชื่อเหมือนกันกับ Field ที่สืบทอด จาก คลาสแม่ไป อันนี้จะเป็นเรื่องของ "shadowed" ซึ่งจะกล่าวในบทความอื่นๆ



Constructors and Inheritance 

Constructor ไม่สามารถสืบทอดได้ แต่ใน คลาสลูกสามารถเรียก Constructor ของ คลาสแม่ทำงานได้โดยใช้ คำสั่ง super

แต่ในความเป็นจริงแล้ว Constructor ของคลาสลูกจะเรียกใช้ Constructor ของคลาสแม่ทำงานตลอดอยู่แล้วเราเพียงแค่ไม่เห็นมัน Compiler จะใส่ให้อัติโนมัส มันจะเรียก No-Parameter Constructor ของคลาสแม่ทำงาน 

ตัวอย่าง code

ถ้าหากคุณไม่ได้กำหนด Constructor ให้ คลาสแม่ และ คลาสลูก




Compiler เวลาอ่านจะใส่ให้แบบนี้





ถ้าหากกรณีที่คุณ กำหนด Constructors ของคลาสแม่เอง โดยไม่มี No-Parameter Constructor แต่มี Constructors ที่มี Parameter แทน Compiler จะบ่นคุณให้คุณเรียก Constructor ของคลาสแม่ทำงานใน Constructor ของ คลาสลูก  หากมีหลาย Constructor จงจำไว้ Constructor  ของคลาสลูก 1 อัน ต้องเรียก Constructor  ของคลาสแม่ ทำงาน 1 อันเท่านั้น

ตัวอย่าง code










1 ความคิดเห็น: