05_3_Constructor
Constructor Method เมธอดที่มีชื่อเดียวกับกับชื่อคลาส ในการเขียนโปรแกรมเมื่อมีการสร้างอ๊อปเจ็คขึ้นมา โปรแกรมจะมีการเรียกเมธอดที่มีชื่อเดียวกับชื่อคลาสทันที (ถ้ามีการสร้างเมธอดนี้ไว้)
การสร้าง Constructor Method Modifier มีอยู่ 2 ค่า คือ public และ default เท่านั้น Constructors จะไม่มีการ return type แม้แต่ void ก็ห้ามใช้ Constructor ถ้าไม่มีพารามิเตอร์จะเรียกว่า default constructor ตัวอย่างเช่น class A{ //สร้าง class A() {} //constructor Method สังเกตว่าไม่มี return type }
Note : เมธอดใดที่มีชื่อเดียวกับชื่อคลาส เรียกว่า Constructor Method class A{ //สร้าง class A() {} //default constructor }
Overloaded Constructor Method ในคลาสหนึ่งๆ สามารถมี Constructor ได้มากกว่า 1 Constructor เมื่อใดที่มี Constructor มากกว่า 1 จะเรียกกว่า Overloaded Constructor Method สามารถส่ง parameter ได้หลายรูปแบบ
A.java class A{ //สร้าง class double num; A() {} //default constructor A(int x){ num = x; } A(double y){ num = y;
Static binding and dynamic binding 07 Static binding and dynamic binding
Static binding และ dynamic binding Static Binding การผูกชื่อจะเกิดขณะคอมไพล ใชกับชื่อตัวแปร หรือ instanceการเรียกใช้ function แบบเดิมจะถูกจำกัดขอบเขตขณะ compile Dynamic Binding การผูกชื่อเกิดขึ้นขณะทํางาน (runtime) เป็นการเปลี่ยนแปลงรูปแบบตามสภาพของ object ที่ได้ถูกสร้างขึ้น เวลาที่ compiler จัดสรรหน่วยความจำให้กับตัวแปรในขณะที่โปรแกรมกำลังถูก execute (run อยู่) ไม่ใช่ในขณะที่กำลัง compile โปรแกรม ไม่สามารถเปลี่ยนแปลงหรือแก้ไขข้อมูลเกี่ยวกับตัวแปร หรือเมธอดได้หลังจากคอมไพล์โปรแกรมแล้ว
Polymorphism by Inheritance 07 Polymorphism by Inheritance
Polymorphism by Inheritance Methods หรือ Class ของวัตถุใดๆ จะถูกตรวจสอบเมื่อ run-time (Dynamic binding) จากรายละเอียดที่ได้กำหนดไว้ (Implementation) ของ Methods และ Class ใน Inheritance Hierarchies ในภาษาจาวา เมื่อมีการเรียกใช้ Method ใดๆ กับวัตถุหนึ่ง Java จะทำการค้นหารายละเอียดการกระทำ (Implementation) ของ Method ที่อยู่ภายในคลาสเดียวกัน ถ้าไม่พบจะทำการค้นหาจาก Superclass ทำเช่นนี้ไปเรื่อยๆ ไล่ขึ้นไปตามลำดับขั้นของ class Hierarchies จนกระทั่งพบ
Polymorphism Polymorphism เป็นลักษณะการทำงานของเมธอดชนิดหนึ่งที่อาศัยการทำงานของ Inheritance และ Dynamic Binging คือเมธอดหนึ่งสามารถตอบสนองการทำงานได้หลายรูปแบบขึ้นอยู่กับอ็อบเจ็คที่ส่งมา มีข้อกำหนดอยู่ว่า Parameter ของ Polymorphism จะต้องอ้างอิงกับ superclass เสมอ การนำ Polymorphism มาใช้งานจะทำให้สามารถนำเมธอดหนึ่งไปใช้งานได้หลายหน้าที่โดยไม่จำเป็นต้องสร้างเมธอดของแต่ละคลาสขึ้นมาใหม่
Polymorphism poly = many (มีหลายอย่าง, หลายแบบ), morphos = form (รูปแบบ), polymorphic จึงหมายถึงการมีมากกว่า 1 รูปแบบ หรือ many forms แนวความคิดของ polymorphism ก็คือการที่ object ที่เรียกใช้งาน method ของอีก object หนึ่ง ไม่จำเป็นต้องรู้ว่า object ที่รับ message นั้น เป็น object ของ class อะไร
ตัวอย่าง Polymorphism 1
Polymorphism by Inheritance Subtypes subclass เป็น specialization ของ superclass ทุก instance ของ subclass จัดเป็น instance ของ superclass สิ่งมีชีวิต สิ่งมีชีวิต คน งู คน งู
ตัวอย่าง Polymorphism 1 class สิ่งมีชีวิต { เคลื่อนที่(); เคลื่อนที่(ความเร็ว); // ในกรณีของ เคลื่อนที่() กับ เคลื่อนที่(ความเร็ว) ใน สิ่งมีชีวิต ถือเป็น overloading }
ตัวอย่าง Polymorphism 1 (ต่อ) class งู extends สิ่งมีชีวิต { เคลื่อนที่() { "เลื้อย"; } เคลื่อนที่(ความเร็ว) { "เลื้อย"; } } class คน extends สิ่งมีชีวิต { เคลื่อนที่() { "เดิน"; } เคลื่อนที่(ความเร็ว) { ถ้า ความเร็ว=เร็ว "วิ่ง" มิฉะนั้น เคลื่อนที่(); } } // ในกรณีของการ implement เคลื่อนที่() กับ เคลื่อนที่(ความเร็ว) ใน งู กับ คน // ไม่เรียก overloading แต่จะเรียก overriding เนื่องจากเป็นการ re-implement superclass' methods
ตัวอย่าง Polymorphism 1 (ต่อ) // เวลาใช้ คน x = new คน(); x.เคลื่อนที่(); x.เคลื่อนที่(เร็ว); // แสดงถึง polymorphisms ที่ parameter ต่างกัน แต่ object คน x เหมือนกัน สิ่งมีชีวิต y = x; สิ่งมีชีวิต z = new งู(); y.เคลื่อนที่(); z. เคลื่อนที่(); // แสดงถึง polymorphisms ที่ object ต่างชนิดกัน คือ คน y กับ งู z ถึงแม้ว่าจะอยู่ในคราบสิ่งมีชีวิตเหมือนกันก็ตาม
ตัวอย่าง Polymorphism 2
ตัวอย่าง Polymorphism 2 class One { public void m() { System.out.println("One's implementation"); } one
class Two extends One class Two extends One { public void m() { System.out.println("Two's implementation"); } one Two
class Three extends Two public void m() { System.out.println("Three's implementation"); } one Two Three
class TestPoly class TestPoly { public static void main(String[] args) { One one = new One(); Two two = new Two(); Three three = new Three(); one.m(); // (1) two.m(); // (2) three.m(); // (3) one = two; // (4) one.m(); // (5) two = three; // (6) three.m(); // (7) } static void show(One a){ a.m();
หรือ ทำรูปแบบดังต่อไปนี้ class TestPoly2 { public static void main(String[] args) { TestPoly2 myPoly = new TestPoly2(); One one = new One(); Two two = new Two(); Three three = new Three(); myPoly.show(one); // (1) myPoly.show(two); // (2) myPoly.show(three); // (3) } static void show(One a){ a.m();
ตัวอย่าง 3 Polymorphism 3
Polymorphism Shape Square Circle name getName( ) calculateArea( ) side radius
Polymorphism class Shape { private String name; public Shape(String aName) { // Overloaded Constructor Method name=aName; } public String getName( ) { return name; public float calculateArea( ) { return 0.0f; } // End Shape class a generic action
Understanding Polymorphism inheritance class Circle extends Shape { private float radius; public Circle(String aName){ super(aName); radius = 1.0f; } public Circle(String aName, float radius) { this.radius = radius; public float calculateArea() { return (float)3.14f*radius*radius; } // End Circle class overloading overriding
Understanding Polymorphism class Square extends Shape { private float side; public Square(String aName) { super(aName); side = 1.0f; } public Square(String aName, float side) { this.side = side; public float calculateArea() { return (float) side*side; } // End Square class
Understanding Polymorphism public class ShapeDemoClient { public static void main(String argv[ ]) { Shape c1 = new Circle("Circle C1"); Shape c2 = new Circle("Circle C2", 3.0f); Shape s1 = new Square("Square S1"); Shape s2 = new Square("Square S2", 3.0f); Shape shapeArray[ ] = {c1, s1, c2, s2}; for (int i = 0; i < shapeArray.length; i++) { System.out.println("The area of " + shapeArray[i].getName( ) + " is " + shapeArray[i].calculateArea( ) + " sq. cm."); } } // End main } // End ShapeDemoClient1 class rule of subtype dynamic binding
การใช้ Keyword : “Final” เมื่อใช้กับตัวแปร จะทำให้ตัวแปรนั้นเป็นค่าคงที่ (Constant) ไม่สามารถเปลี่ยนแปลงค่าได้ เมื่อใช้เป็น modifier ให้กับ class ไม่สามารถทำการ subclass คลาสที่ประกาศเป็น Final class เมื่อใช้กับเมธอด จะเป็นการป้องกันการ Override เมธอด ไม่สามารถทำการ override เมธอดที่ประกาศเป็น Final method