คอนสตรัคเตอร์ คือ สิ่งที่มีไว้สำหรับกำหนดค่าเริ่มต้นให้กับตัวแปรคลาสของอ็อปเจ็ค คอนสตรัคเตอร์จะทำงานอัตโนมัติเมื่อมีการ new อ็อปเจ็คขึ้นมา ระบบจะทำการจองพื้นที่ในหน่วยความจำสำหรัวแปรอ็อปเจ็คแล้วตามด้วยคอนสตรัคเตอร์
การเขียน คอนสตรัคเตอร์
- หัวของคอนสตรัคเตอร์ต้องชื่อเหมือนคลาสนั้นๆ วิธีการเรียกใช้ก็คือ new Student(…)เช่น
public class Student
{
public double weight;
public Student()
{
Weight = 55.75;
}
}
- คอนสตรัคเตอร์ต้องไม่มีประเภทของผลลัพธ์ที่จะคืนค่าออกไป และก็ไม่ต้องมีคำว่า void ด้วย เพราะมันจะทำให้กลายเป็นเมท็อด
- ไม่มีคำว่า static
รูป9-1
สร้างคลาส Box ขึ้นมา และสร้างคอนสตรัคเตอร์ public Box() ในบรรทัดที่ 8 ภายในคอนสตรัคเตอร์ก็สามารถตั้งค่าให้กับตัวแปรได้เลย
รูป 9-2
บรรทัดที่ 6-7 : สร้างอ็อปเจ็คขึ้นมา ตรงBox() จะถือว่าเป็นการเรียกเรียกคอนสตรัคเตอร์ของ Box ค่าต่างๆใน
คอนสตรัคเตอร์ก็จะมาอยู่ที่ตัวอ็อปเจ็คเลย
บรรทัดที่ 9-10 : ให้แสดงค่าออกทางหน้าจอโดยจะเห็นว่าตรง +box1.volume() ไม่ต้องให้ค่าอะไรลงไปอีก
เพราะ .volume จะเอาค่าของ box1 มาใช้ และ box1 ก็ได้ค่ามาจากคอนสตรัคเตอร์อีกที
ผลลัพธ์
box1 และ box2 เรียกคอนสตรัคเตอร์ Box() เหมือนกัน ดังนั้นผลลัพธ์ที่ได้จากการคำนวณย่อมต้องเหมือนกัน
รูป 9-3
คอนสตรัคเตอร์ที่รับพารามิเตอร์(Parameterized constructors)
จากตัวอย่างข้างบนจะเห็นว่าหากมีการ new Box() ขึ้นมาค่าต่างๆจะเหมือนกันทำให้การใช้งานยังไม่ดีเท่าที่ควร constructor ควรจะกำหนดค่าได้ดังนั้นก็ใช้วิธีแบบเมท็อดมาช่วยคือให้คอนสตรัคเตอร์รับพารามิเตอร์ โดยการรับพารามิเตอร์จะเป็นเกณฑ์แบบเดียวกันกับฟังก์ชัน[1] เรียกว่า overloaded constructor
ตัวอย่างของ overloaded constructor คือมีคอนสตรัคเตอร์ที่ต้องชื่อเหมือนกันแต่รับพารามิเตอร์ต่างๆกันเวลาที่จะเรียกใช้เมื่อ new ขึ้นมา ใน() ก็ให้ใส่ค่าลงไปตามที่พารามิเตอร์ต้องการ
public class Student
{
public Student( ) {}
public Student(int id) {}
public Student(double weight, double height) {}
public Student(int id, double weight, double height ) {}
}
รูป9-4
ในคลาส Box เหมือนเดิม แต่เปลี่ยนคอนสตรัคเตอร์ใหม่ให้คอนสตรัคเตอร์รับพารามิเตอร์เป็น double 3 ตัวจากนั้นเอาค่าจากพารามิเตอร์ที่รับเข้ามาไปเก็บไว้ในตัวแปรคลาส
รูป9-5
จะเห็นได้ว่า หากให้คอนสตรัคเตอร์รับพารามิเตอร์ แต่เมื่อ new ขึ้นมาแล้วไม่ใส่พารามิเตอร์ลงไปจะเกิด error แบบบรรทัดที่ 6-7 วิธีแก้ error ก็ใส่พารามิเตอร์ให้ถูกต้อง
รูป9-6
หลังจากใส่พารามิเตอร์ลงไปแล้ว error ก็จะหายไป พารามิเตอร์ที่ใส่ไปตรงนี้จะถูกนำไปเป็นค่าตั้งต้นในคอนสตรัคเตอร์
ผลลัพธ์
จะเห็นได้ว่าหากใช้คอนสตรัคเตอร์ที่รับพารามิเตอร์ เมื่อเรา new และใส่พารามิเตอร์ลงไป ค่าในคอนสตรัคเตอร์ของอ็อปเจ็คที่ไป new มาก็มีค่าต่างกัน ผลลัพธ์ที่ได้ก็จะมีค่าต่างกันไปด้วย
รูป9-7
Default constructor
คือสิ่งคอมไพล์เลอร์สร้างขึ้นอัตโนมัติเพื่อกำหนดค่าให้กับตัวแปรเป็น 0 สำหรับ int และ 0.0 สำหรับ double รวมถึง false สำหรับ Boolean ใช่ในกรณีที่เราไม่ได้กำหนดค่าเริ่มต้นให้กับตัวแปร
ภายใน default constructor จะไม่มีคำสั่งใดๆ
class Student( ) { }
อธิบายเพิ่มเติม
ก่อนหน้านี้สิ่งที่เขียนบ่อยก็คือ คลาส Scanner ที่ใช้สำหรับรับข้อมูลเข้ามาจากแป้นพิมพ์ เวลาที่เราใช้คำสั่ง new Scanner(…) เช่น new Scanner(System.in) ก็จะเป็นการส่งค่าพาราเตอร์ที่รับเข้าจากแป้นพิมพ์(System.in) ไปให้คอนสตรัคเตอร์ของ Scanner
new Scanner(new File(“c:/file.txt”)) แบบนี้ก็จะเป็นการสร้างอ็อปเจ็ค 2 ตัวคือ จากการ new File ทำหน้าไปเอาสตริงจาก file มาเก็บเป็นอ็อปเจ็ค แล้วส่งอ็อปเจ็คตัวนี้ไปเป็นพารามิเตอร์ของอ็อปเจ็ค Scannerอีกที ก็จะทำให้ Scanner อ่านไฟล์ได้
คีย์เวิร์ด this กับ super
คีย์เวิร์ด this ทำหน้าที่อยู่ 2 อย่าง
1.คือเวลาที่เราตั้งชื่อตัวแปรในพารามิเตอร์เป็นตัวเดียวกับตัวแปรคลาส ซึ่งปกติการตั้งชื่อตัวแปรซ้ำกันจะทำไม่ได้ แต่ในกรณีนี้ได้โดยการใช้คีย์เวิร์ด thisเข้ามาช่วย
รูป9-8
2.ใช้เวลาที่จะเรียกใช้คอนสตรัคเตอร์ที่อยู่ในคลาสเดียวกัน
คีย์เวิร์ด super ใช้เมื่อต้องการเรียกให้คอนสตรัคเตอร์ของคลาสแม่ทำงาน
รูป9-9
สร้างคลาสชื่อ Calculator
บรรทัดที่ 14 : ให้คอนสตรัคเตอร์ของคลาส Calculator รับพารามิเตอร์เป็น int 2ตัว แต่ตัวแปรในพารามิเตอร์
กับตัวแปรคลาสเหมือนกัน ดังนั้นในคอนสตรัคเตอร์ก็เขียน this ลงไปด้วย(จริงๆคือถ้าไม่อย่างเขียน this ก็ตั้งตัวแปรตรงพารามิเตอร์เป็นชื่อคล้ายๆกันก็ได้ เช่น ตัวแปรคลาสชื่อ x กลัวลืมว่าจะต้องเอาค่าไปใส่ตัวแปรชื่อ xในพารามิเตอร์ก็ตั้งเป็น xx พอชื่อไม่เหมือนกันก็ไม่ต้องใส่ this)
บรรทัดที่ 6 : ต้องการตั้งค่าให้ x,y ก็สามารถเรียกใช้คอนสตรัคเตอร์ที่มีอยู่ปล้วในคลาสเดียวกันได้ด้วยคีย์เวิร์ด
this(..);
รูป9-10
สร้างอีกคลาสโดยให้คลาสนี้รับคุณสมบัติมาจากคลาสCalculator โดยใช้คีย์เวิร์ด extends ในคอนสตรัคเตอร์ของ Calculator2 ให้เรียกคอนสตรัคเตอร์ของ Calculator ได้โดยใช้ super();
รูป9-11
เมื่อมาถึงเมท็อด main ให้เรียกแค่อ็อปเจ็คCalculator2 ก็จะได้ของจากทั้ง Calculator และ Calculator2
Tag ที่น่าสนใจ: constructor parameterized_constructors default_constructor overloaded_constructor java oop programming classes methods objects programming_basics object-oriented_programming java_basics
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM