9. คอนสตรัคเตอร์(Constructor)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

9. คอนสตรัคเตอร์(Constructor)

            คอนสตรัคเตอร์ คือ สิ่งที่มีไว้สำหรับกำหนดค่าเริ่มต้นให้กับตัวแปรคลาสของอ็อปเจ็ค คอนสตรัคเตอร์จะทำงานอัตโนมัติเมื่อมีการ 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

 

 

 


[1] อ่านเรื่องฟังก์ชัน

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น