Inheritance และ Encapsulation
การสร้างหรือพัฒนาคลาสใหม่จากคลาสเดิมที่ มีอยู่แล้ว คลาสใหม่จะนำแอตทริบิวต์และเมธอดของ คลาสเดิมมาใช้ เป็นการถ่ายทอดคุณสมบัติจากคลาสหนึ่งสู่อีก คลาสหนึ่งนั่นเอง เรียกคลาสที่ถ่ายทอดคุณสมบัติของคลาสว่า คลาสแม่ (SuperClass) เรียกคลาสที่ได้รับการถ่ายทอดว่า คลาสลูก (Subclass) คลาสลูกสามารถพัฒนาต่อเติมแอตทริบิวต์ และเมธอดของตัวเองได้ คลาสลูกสามารถปรับปรุงแก้ไขแอตทริบิวต์ และเมธอดเดิมที่ได้รับ มาจากคลาสแม่ได้ 2
3 คลาส Car เป็นคลาสรถทั่วไปที่มีสามารถ สตาร์ทเครื่องได้ – start() เปลี่ยนเกียร์ได้ – ChangeGear() ดับเครื่องได้ – stop() คลาส Bus เป็นคลาสรถบัสที่มีสามารถ สตาร์ทเครื่องได้ เปลี่ยนเกียร์ได้ ดับเครื่องได้ มีผู้โดยสาร - Seat ดังนั้น คลาส Car เป็นคลาสแม่ และ คลาส Bus เป็นคลาสลูกที่สืบทอดคุณสมบัติ จากคลาส Car
4 เป็นคลาสที่เป็นต้นแบบของแอตทริบิวต์และ เมธอด อนุญาตให้คลาสอื่นสืบทอดแอตทริบิวต์และ เมธอดไปได้ทั้งหมด ยกเว้นแอตทริบิวต์ที่มีระดับการเข้าถึงเป็น private และ เมธอดที่เป็น constructor ระดับการเข้าถึงแอตทริบิวต์และเมธอดของ คลาสแม่เป็น protected มีรูปแบบการใช้งาน ดังนี้ [modifier] class SuperClassName { [AttributeName] [MethodName] } โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนด คุณสมบัติการเข้าถึงคลาส SuperClassName เป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการ ประกาศแอตทริบิวต์ MethodName เป็นส่วนของการ ประกาศเมธอด
เป็นคลาสที่สืบทอดแอตทริบิวต์และเมธอดจาก คลาสแม่ คลาสลูกสามารถเรียกใช้แอตทริบิวต์และเมธ อดจากคลาสแม่ได้ และคลาสลูกมีแอตทริบิวต์และเมธอดเพิ่มเติม เป็นของตัวเองได้ การระบุความสัมพันธ์ให้คลาสเป็นคลาสลูก ต้องใช้คีย์เวิร์ด extends มีรูปแบบการใช้งาน ดังนี้ [modifier] class SubClassName extends SuperClassName { [AttributeName] [MethodName] } 5 โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนด คุณสมบัติการเข้าถึงคลาส SubClassName เป็นชื่อคลาสลูก SuperClassName เป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการประกาศ แอตทริบิวต์ MethodName เป็นส่วนของการประกาศ เมธอด
import java.util.Scanner; class employee { protected float rate=300.0f; } class daily_emp extends employee { } class monthly_emp extends employee { } 6 public class SupSubClassTest { public static void main(String[] args) { float r; employee emp1 = new employee(); System.out.println("\"Employee\"\nRate per Day=" +emp1.rate+"BAHT"); Scanner scan = new Scanner(System.in); System.out.print("\"Daily Employee\"\nEnter Rate = "); r = scan.nextFloat(); daily_emp emp2 = new daily_emp(); emp2.rate = r; System.out.println("Rate per Day = " + emp2.rate + " BAHT"); System.out.print("\"Monthly Employee\"\nEnter Salary : "); r = scan.nextFloat(); monthly_emp emp3 = new monthly_emp(); emp3.rate = r; System.out.println("Rate per Day = " + emp3.rate/30 +" BAHT"); } }
Overriding เป็นการเปลี่ยนแปลงการทำงาน ของเมธอดในคลาสลูก ที่สืบทอดมาจากคลาสแม่ เมธอดในคลาสลูกจะมีชื่อเมธอด, ชนิดข้อมูล ที่คืนค่า, จำนวนและชนิดข้อมูลของ อาร์กิวเมนต์ที่เหมือนกับคลาสแม่ สามารถพัฒนาเมธอดให้มีการทำงานในเรื่อง เดียวกัน แต่แตกต่างกัน ในรายละเอียดของการทำงาน เช่น การคำนวณหาพื้นที่ของรูปทรงเรขาคณิตต่าง ๆ ที่ มีสูตรคำนวณที่แตกต่างกัน การคำนวณค่าแรงของพนักงานที่มีวิธีคำนวณที่ แตกต่างกันไปในแต่ละตำแหน่ง 7
import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f; int hour; float calOT() { return hour*rate/work; } class daily_emp extends employee { } class monthly_emp extends employee { float pay, bonus; float calOT() { pay = hour*rate/work; if (hour>100) pay += bonus; return pay; } 8 public class InheritOverRideTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("Enter total OT hour : "); employee emp1 = new employee(); emp1.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + emp1.hour + ") = " + emp1.calOT() + " BAHT"); daily_emp emp2 = new daily_emp(); emp2.hour = emp1.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); emp2.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp2.rate + " * " + emp2.hour + ") = " + emp2.calOT()+ " BAHT"); monthly_emp emp3 = new monthly_emp(); emp3.hour = emp1.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); emp3.rate = scan.nextFloat()/30; System.out.print("Enter Bonus = "); emp3.bonus = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp3.rate + " * " + emp3.hour + ") + " + emp3.bonus + " = " + emp3.calOT() + " BAHT"); }
constructor เป็นสิ่งที่คลาสลูกไม่สามารถสืบ ทอดจากคลาสแม่ได้ แต่คลาสลูกสามารถใช้งาน constructor ของ คลาสแม่ได้ โดยใช้คีย์เวิร์ด super จึงสามารถทำ overload constructor ใน คลาสแม่ได้ตามปกติ 9
10 import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f, pay; public employee(int h) { pay = h*rate/work; } public employee(int h, float r) { pay = h*r/work; } public employee(int h, float r, float b) { this(h,r); if (h>100) pay += b; } class daily_emp extends employee { public daily_emp (int h,float r) { super(h,r); } class monthly_emp extends employee { public monthly_emp (int h, float r, float b) { super(h,r,b); } public class InheritOverLoadTest { public static void main(String[] args) { float rate; Scanner scan = new Scanner(System.in); System.out.print("Enter total OT hour : "); int hour = scan.nextInt(); employee emp1 = new employee(hour); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + hour + ") = " + emp1.pay + " BAHT"); System.out.print("\"Daily Employee\"\nRate per Day = "); rate = scan.nextFloat(); daily_emp emp2 = new daily_emp(hour,rate); System.out.println("Total OT Pay = (" + emp2.rate + " * " + hour + ") = " + emp2.pay + " BAHT"); System.out.print("\"Monthly Employee\"\nEnter Salary = "); rate = scan.nextFloat(); System.out.print("Enter Bonus = "); float bonus = scan.nextFloat(); monthly_emp emp3 = new monthly_emp(hour,rate/30,bonus); System.out.println("Total OT Pay = (" + emp3.rate + " * " + hour + ") + " + bonus + " = " + emp3.pay + " BAHT"); }
Final เป็นคีย์เวิร์ดที่ใช้นำหน้าตัวแปร, เมธอด และคลาส ทำให้มีคุณสมบัติดังนี้ ตัวแปรเป็นค่าคงที่ ไม่สามารถเปลี่ยนแปลง ค่าได้ เมธอดไม่สามารถถูก override ได้ คลาสไม่สามารถถ่ายทอดคุณสมบัติได้ คือไม่สามารถเป็นคลาสแม่ได้ 11
import java.util.Scanner; final class employee { float rate = 300.0f, work=10.0f; int hour; float calOT() { return hour * rate / work; } float calOT(float bonus) { float pay = hour*rate/work; if (hour>100) pay += bonus; return pay; } 12 public class FinalTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); employee emp = new employee(); System.out.print("Enter total OT hour : "); emp.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp.rate + " * " + emp.hour + ") = " + emp.calOT() + " BAHT"); employee daily_emp = new employee(); daily_emp.hour = emp.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); daily_emp.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + daily_emp.rate + " * " + daily_emp.hour + ") = " + daily_emp.calOT()+ " BAHT"); employee monthly_emp = new employee(); monthly_emp.hour = emp.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); monthly_emp.rate = scan.nextFloat(); monthly_emp.rate = monthly_emp.rate/30; System.out.print("Enter Bonus = "); int b = scan.nextInt(); System.out.println("Total OT Pay = (" + monthly_emp.rate + " * " + monthly_emp.hour + ") + " + b + " = " + monthly_emp.calOT(b) + " BAHT"); }
import java.util.Scanner; class employee { float rate = 300.0f, work=10.0f; int hour; final float calOT() { return hour*rate/work; } class daily_emp extends employee { } class monthly_emp extends employee { float calmOT(float bonus) { float pay = hour*rate/work; if (hour>100) pay += bonus; return pay; } 13 public class FinalMethod { public static void main(String[] args) { Scanner scan = new Scanner(System.in); employee emp1 = new employee(); System.out.print("Enter total OT hour : "); emp1.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + emp1.hour + ") = " + emp1.calOT() + " BAHT"); daily_emp emp2 = new daily_emp(); emp2.hour = emp1.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); emp2.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp2.rate + " * " + emp2.hour + ") = " + emp2.calOT()+ " BAHT"); monthly_emp emp3 = new monthly_emp(); emp3.hour = emp1.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); emp3.rate = scan.nextFloat(); emp3.rate = emp3.rate/30; System.out.print("Enter Bonus = "); int b = scan.nextInt(); System.out.println("Total OT Pay = (" + emp3.rate + " * " + emp3.hour + ") + " + b + " = " + emp3.calmOT(b) + " BAHT"); }
เป็นการซ่อนรายละเอียดเพื่อป้องกันไม่ให้ ออบเจ็กต์ภายนอกเข้าถึงข้อมูล ได้อย่างอิสระ ออบเจ็กต์ไม่สามารถเรียกใช้หรือเปลี่ยนแปลง ค่าข้อมูลได้ สามารถจำกัดสิทธิการใช้งานแอตทริบิวต์และ เมธอดได้ด้วย ระดับการเข้าใช้งานของ access modifier หากต้องการซ่อนรายละเอียด ให้กำหนดเป็น แบบ private หากต้องการใช้งานแอตทริบิวต์หรือเมธอด ใดๆ ให้กำหนดเป็นแบบ public 14
15