Class Inheritance and Interfaces
การสืบทอด Inheritance เป็นการสร้าง class ใหม่จาก class ที่มีอยู่แล้ว เป็นแนวคิดที่สำคัญและทำให้โปรแกรมมีขีดความสามารถสูง ทุก class ที่กำหนดในจาวา จะสืบทอดจาก class ที่มีอยู่แล้ว การสืบทอด class อาจเป็นแบบ explicit หรือ implicit
Superclasses and Subclasses class B สืบทอดมาจาก class A Superclass : class A Subclass : class B subclass สืบทอดมาจาก superclass สามารถสร้าง data (attribute) และ method ใหม่ได้ ทำงานได้มากกว่า superclass superclass = parent class = base class subclass = child class = extended class = derived class
data และ method จาก Circle class radius: double +getRadius(): double +setRadius(radius: double): void +findArea(): double Cylinder length: double +getLength(): double +setLength(length: double): void +findVolume(): double Cylinder class สืบทอด data และ method จาก Circle class และ Cylinder class ยังมี data และ method ของตนเองด้วย
data และ method จาก Computer class manufacturer: String Processor: String ramSize: int diskSize: int +getRamSize(): int +getDiskSize(): int +toString(): String Laptop screenSize: double weight: double +getWeight() : double +getScreenSize():double Laptop class สืบทอด data และ method จาก Computer class และ Laptop class ยังมี data และ method ของตนเองด้วย
Keyword super super ใช้อ้างถึง super class ของ class ที่ปรากฏคำว่า super สามารถใช้ได้ 2 แบบ เรียก superclass constructor เรียก superclass method
การเรียก superclass method หรือ super(parameters); super() เรียก default constructor ของ superclass super(parameters) เรียก superclass constructor ที่มี parameters ที่ตรงกัน
จะต้องปรากฏที่บรรทัดแรกของ subclass constructor super() หรือ super(parameters) จะต้องปรากฏที่บรรทัดแรกของ subclass constructor ซึ่งเป็นวิธีเดียวที่จะเรียก superclass constructor ปกติจะละ super() เพราะ subclass constructor จะเรียก super() อยู่แล้ว ถ้าไม่มี explicited invoke
constructor ถูกใช้เพื่อสร้าง instance ของ class การสืบทอด properties(data หรือ attribute) และ methods คือ subclass ไม่สามารถสืบทอด constructor ของ superclass โดย constructor ของ subclass สามารถเรียกใช้ constructor ของ superclass โดยใช้ คำหลัก super ถ้าไม่มีการใช้คำหลัก super ใน subclass จะทำให้ default constructor ของ superclass ถูกเรียกโดยอัตโนมัติ
default constructor ของ superclass ถูกเรียกโดยอัตโนมัติ
x default constructor เรียก y default constructor
ถ้า constructor ของ superclass ไม่ใช่ default constructor subclass จะไม่สามารถใช้ constructor ของ superclass class x ไม่ได้กำหนด constructor ดังนั้น จึงใช้ default constructor default constructor ของ x จะเรียก default constructor ของ y โดยอัตโนมัติ แต่ไม่พบ ดังนั้นจึง compile ไม่ได้
เรียก default superclass constructor เรียก superclass constructor Circle(r)
การเรียก Superclass Methods คำหลัก super นอกจากใช้เพื่ออ้างถึง constructor ของ superclass แล้วยังสามารถใช้เพื่ออ้างถึง method ได้ super.method(parameters) class cylinder{ double findVolume() { return super.findArea() * length; } ในกรณีนี้ไม่จำเป็นต้องมี super เพราะ findArea() อยู่ใน Circle class และถูกสืบทอดโดย Cylinder class
Overriding Methods subclass ที่สืบทอด method จาก superclass บางครั้ง อาจจำเป็นต้องแก้ไขเปลี่ยนแปลง method ที่กำหนดใน super class method overriding คือ method ที่มีอยู่ใน superclass แล้วนำมาปรับปรุงแก้ไขเพิ่มเติมใน subclass โดย method signature ไม่เปลี่ยนแปลง
กรณีนี้จำเป็นต้องใช้คำหลัก super Overriding method กรณีนี้จำเป็นต้องใช้คำหลัก super
toString method การเรียก object.toString() จะคืนค่า string โดย default จะคืนค่า string ที่ประกอบด้วย ชื่อ class ของ object @ ที่อยู่ของ object
Overriding method Java compiler แปล CylinderA ใน println() ให้เป็น string ด้วยการเรียก toString() โดยอัตโนมัติ
protected modifier สามารถใช้กับ data และ method ใน class protected data และ protected method ในpublic class สามารถถูก access โดย class ต่างๆใน package เดียวกัน subclass ซึ่งอาจอยู่ใน package เดียวกัน หรือ package อื่น
package p1 package p2 public class C1 public class C2 extends C1 protected int x x สามารถถูกอ่านได้ public class C3 public class C4 C1 ob; ob.x สามารถถูกอ่านและแก้ไข C1 ob; ob.x ไม่สามารถถูกอ่านและแก้ไขได้
การใช้ modifiers กับความสามารถมองเห็นได้ - private - protected - public modifier เหล่านี้ จะเพิ่มความสามารถของ class หรือ class member ในการมองเห็น หรือเข้าถึงตามลำดับต่อไปนี้ private, ไม่มี modifier, protected, public
private ซ่อนสมาชิกของ class โดยสมบูรณ์ ไม่สามารถเข้าถึงจากภายนอก class ไม่มี modifiers อนุญาตให้เข้าถึงสมาชิกของ class ได้เฉพาะ สมาชิกจากทุก class ภายใน package เดียวกัน เรียกว่า package-private protected อนุญาตสมาชิกของ class ใน package เดียวกัน และ subclass จาก package อื่น เข้าถึงสมาชิกของ class public อนุญาตสมาชิกจากทุก class เข้าถึงสมาชิกของ class ได้
subclass สามารถ - override protected method ใน superclass เปลี่ยนความสามารถในการมองเห็น method ดังกล่าว จาก protected เป็น public subclass ไม่สามารถ เปลี่ยนความสามารถในการมองเห็นให้น้อยลงได้
final modifier สามารถใช้ได้กับ การประกาศค่าคงที่ ตัวอย่าง final int VAT = 0.07; final double PI = 3.14159; การกำหนดให้ class ไม่สามารถเป็น parent class ตัวอย่าง final class public final class Math extends Object public final class String extends Object public final class StringBuffer extends Object
Abstract Classes เป็น class ที่ - มีลักษณะทั่วไปและมีการกำหนดคุณสมบัติน้อยที่สุด ถูกออกแบบเพื่อเป็นต้นแบบของ subclass - ไม่มี instance หรือ object Abstract Method มีแต่ method signature การใช้งานอยู่ที่ subclass
Object Cylinders -length: double +getLength(): double +setLength(length:double): void +findVolumn(): double Object Geometric -color: String -filled: boolean +getColor() : String +setColor(String color): void +isFilled(): boolean +setFilled(boolean filled): void +findArea(): double +findPerimeter(): double Circles -radius: double +getRadius():double +setRadius(radius:double): void Rectangle -width: double -length: double +getWidth(): double +setWidth(width:double): void +getLength(): double +setLength(length: double): void
Geometric
Geometric
public String toString() method toString ได้ถูกกำหนดไว้ใน Object class และได้มีการปรับปรุงใน Circle, Rectangle, และ Cylinder class public String toString() abstract methods findArea และ findPerimeter ได้กำหนดไว้ใน Geometric class และได้นำมาใช้ใน Circle และ Rectangle class
abstract method ไม่สามารถอยู่ใน nonabstract class ถ้า subclass ของ abstract superclass ไม่ได้ใช้ทุก abstract methods จะต้องประกาศให้ subclass เป็น abstract หรือ อีกนัยหนึ่ง nonabstract subclass ที่สืบทอดมาจาก abstract class จะต้องใช้ทุก abstract method แม้ว่าใน subclass ไม่มีการใช้งาน
abstract class ไม่สามารถสร้างตัวอย่างหรือวัตถุ แต่อาจจะมี constructor ที่ถูกเรียกใช้โดย constructor ของ subclass ตัวอย่าง constructor ของ Geometric ถูกเรียกใช้โดย Circles class
class ที่ประกอบด้วย abstract method ต้องเป็น abstract abstract class อาจไม่มี abstract method subclass สามารถเป็น abstract ได้ แม้ว่า superclass ไม่ได้เป็น abstract ตัวอย่าง Object class เป็น concrete class แต่ Geometric class ซึ่งเป็น subclass สามารถเป็น abstract ได้
subclass สามารถ override method จาก superclass ให้เป็น abstract และ subclass ก็ต้องกลายเป็น abstract ด้วย abstract class ไม่สามารถสร้าง object ได้ แต่สามารถใช้เป็นประเภทข้อมูลได้ ตัวอย่าง Geometric[] geo = new Geometric[10]
Polymorphism object ของ subclass สามารถเป็น object ของ superclass ได้ในขณะเดียวกัน ตัวอย่าง ถ้า method มีพารามิเตอร์ประเภท Geometric จะสามารถเรียกใช้ method กับ วัตถุประเภท Circle ได้ Circle object เป็นได้ทั้งวัตถุของ Circle และ วัตถุของ Geometric คุณลักษณะแบบนี้เรียกว่า polymorphism
Dynamic Binding method ที่กำหนดไว้ใน superclass สามารถนำมา override ใน subclass ได้ เมื่อมีการเรียกใช้ method ในช่วงของ runtime, Java Virtual Machine จะค้นหา method ที่จะกระทำการ เรียก ความสามารถนี้ว่า Dynamic Binding
การทำงานของ Dynamic binding สมมติ วัตถุ o เป็น ตัวอย่าง ของ class C1, C2, ..., Cn-1 และ Cn โดย C1 เป็น subclass ของ C2, C2 เป็น subclass ของ C3, ... Cn-1 เป็น subclass ของ Cn ดังนั้น Cn เป็น class ทั่วไปที่สุด C1 เป็น class พิเศษที่สุด ในจาวา Cn หมายถึง class Object ถ้าวัตถุ o เรียก method p JVM จะค้นหา method p ใน c1, c2, ... , cn-1 ตามลำดับ จนพบ เมื่อพบที่ class ใด การค้นหาจะหยุด และ จะมีทำงานตาม method p ที่พบในครั้งแรก
Polymorphism ยอมให้ใช้ method กับ วัตถุ ในรูปแบบหลากหลาย implicit casting Circles Rectangle Polymorphism ยอมให้ใช้ method กับ วัตถุ ในรูปแบบหลากหลาย เรียกว่า generic programming
ในขณะที่ compile compiler จะค้นหา matching method ตาม ประเภท จำนวน และลำดับของพารามิเตอร์ (method signature) ในช่วง runtime method อาจถูกใช้ในหลาย subclass JVM จะจัดการรวม method (binding method) ตามประเภทการเรียกใช้
Casting objects and the instanceof Operator อีกประเภทหนึ่งตามลำดับชั้นของการสืบทอด Geometric geoOb1 = new Circles(5); ให้เอาวัตถุวงกลมไปเก็บไว้ในตัวแปรประเภท Geometric Circles c = geoOb1 ให้เอาวัตถุ geoOb1 ไปเก็บไว้ใน c ซึ่งเป็นตัวแปรประเภท Circles Circles object เป็นตัวอย่างของ Geometric เสมอ แต่ Geometric ไม่จำเป็นต้องเป็นตัวอย่างของ Circles
แม้ว่า geoOb1 จะเป็น วัตถุประเภท Circles จริงๆ แต่ compiler จะไม่สามารถทราบได้ ดังนั้น เพื่อบอกให้ compiler ทราบว่า geoOb1 เป็นประเภท Circles จึงต้องใช้ explicit cast ดังนี้ Circles c = (Circles) geoOb1 การ cast จะสำเร็จ ถ้าวัตถุของ superclass เป็นตัวอย่างของ subclass มิฉะนั้น จะเกิด runtime exception