Post on 22-Jul-2021
บทท 13การเขยนโปรแกรมเชงวตถ
การเขยนโปรแกรมเชงวตถ (Object-oriented programming, OOP) ในภาษา Java ซงเปนรปแบบในการเขยนโปรแกรมทสำาคญในปจจบน หรอเปนการพฒนาจากการเขยนโปรแกรมแบบเดมทเราคณเคยกนคอ Procedural programming และเราจะแนะนำาใหคณรจกกบสมบตหลกทสำาคญในการเขยนโปรแกรมเชงวตถในภาษา Java เชน Inheritance Encapsulation และ Polymorphism
การเขยนโปรแกรมเชงวตถ การเขยนโปรแกรมเชงวตถ เปนรปแบบการเขยนโปรแกรมทใช
แนวคดของออบเจค ซงในออบเจคนนจะประกอบไปดวยสมาชก 2 แบบ คอ ตวแปรซงเปนขอมลหรอกำาหนดคณลกษณะของออบเจค และเมธอด เปนฟงกชนการทำางานทออบเจคสามารถทำาได ในการสรางออบเจคนนจะอยภายใตการกำาหนดของคลาส โดยคลาสคอการกำาหนดวาออบเจคจะมสมาชกอะไรบาง และกำาหนดการทำางานของเมธอด ดงนนออบเจคจะสรางจากคลาส เราเรยกออบเจควา instances ของคลาส
ภาษาตางๆ เปนจำานวนมากสนบสนนการเขยนโปรแกรมเชงวตถ เชน Java C++C# Python PHP Ruby และภาษาอนๆ ซง Java ถอวาเปนภาษาของออบเจคอยางเตมรปแบบ การเขยนโปรแกรมเชงวตถนนเปนการพฒนารปแบบของการเขยนโปรแกรมไปอกขนจากการเขยนโปรแกรมแบบเดมทเราเคยเขยนคอ Procedural programming
คณสมบตของ OOP
การเขยนโปรแกรมเชงวตถ มขอดและขอไดเปรยบจากการเขยนโปรแกรมแบบเดมมากมาย ซงสงทสำาคญทสดของมนคอการนำาโคดของโปรแกรมกลบมาใชใหม และคณสมบตอนๆ ดงน
Code reuse: การนำาโคดกลบมาใชใหม ไดอยางมประสทธภาพ Maintenance: งายตอการบำารงรกษาและปรบปรง แตละคลาส
จะมขอบเขตการทำางานและเมธอดของมนเอง Classes: คลาสทสรางขนนน สามารถนำาไปสรางเปนออบเจคไดไม
จำากด และแตละออบเจคมสมาชกเปนของมนเอง Inheritance: คณสมบตการสบทอด คลาสสามารถสบทอดจาก
คลาสอนได ซงเปนการ reuse code และพฒนาตอเดมความสามารถจากคลาสเดมทมอย
Polymorphism: คณสมบตของออบเจคทหลากหลายรปแบบ ซงสามารถจดการไดจาก Base คลาสของมน
Encapsulation: เปนคณสมบตการหอหม เปนแนวคดแบบนามธรรมทวาคณไมจำาเปนตองรวาเมธอดหรอในคลาสนนทำางานยงไง แตมนสามารถทำางานไดสำาเรจและใหผลลพธแกคณได
Abstraction: คอการอธบายการทำางานของคลาสและเมธอดในแบบนามธรรม เพอนำาไปใชสำาหรบออบเจคทมการทำางานแตกตางกน เชน เราบอกวาสตวสามารถเคลอนท การเคลอนทคอการบอกอยางเปนนามธรรม เพราะวาสตวแตละตวมวธการเคลอนททแตกตางกน เชน สนขจะเดน นกจะบน สวนเตาจะคลาน เปนตน
ขางบนนนเปนคณสมบตของการเขยนโปรแกรมแบบออบเจค ทมความสำาคญและมนใชกบการเขยนโปรแกรมในขนสง อยางไรกตามในบทน คณจะไดเรยนรเกยวกบมนทงหมด
คลาสและออบเจคสวนประกอบของการเขยนโปรแกรมเชงวตถทสำาคญคอ คลาสและ
ออบเจค ในตอนแรกเราตองสรางหรอประกาศคลาสขนมา ซงประกอบไป
ดวยตวแปร และเมธอดในการทำางาน หลงจากนนเราจะนำาไปสรางออบเจค การสรางคลาสกเหมอนการออกแบบรปแบบของวตอยางหนงทเราจะสรางขนมา เชน คณจะสรางรถขนมาเรากตองเขยนแบบ เราเรยกสงนวาคลาส และเรานำาไปสรางรถ ซงกคอออบเจค
ในตวอยางเปนรปทแสดงใหเหนถงรายละเอยดของรถทนำามาสรางเปนคลาส จะเหนไดวาจะม attribute เมธอดเพออธบายเกยวกบรถ ซงรถกจะมคณสมบตของมน เชน จำานวนเชอเพลง ความเรวสงสด และอน และสวนของการทำางาน จะเปนการเตมนำามน การเพมและลดความเรว การขบเคลอนรถออกไป และสตารทหรอหยดเครองยนต เปนตน ซงสงเหลานจะถกกำาหนดไวในคลาส
ตวอยางของการประกาศคลาสในภาษา Java เราจะประกาศคลาส Car ซงจะประกอบไปดวยคณสมบต และเมธอดการทำางาน
public class Car {
public float fuel; public int maxSpeed; public int currentSpeed = 0; public String color;
public void reFuel() {
fuel = 100; }
public float getFuel() { return fuel; }
private void setSpeed(int speed) { currentSpeed = speed; }
public void drive() { setSpeed(currentSpeed + 1); if(currentSpeed >= maxSpeed) { currentSpeed = maxSpeed; } }
}ในตวอยาง เปนรปแบบของการประกาศคลาสในภาษา Java ทมช
ของคลาสคอ Car และภายในคลาสจะประกอบไปดวยตวแปร สำาหรบเกบคาคณสมบตตางของรถยนต และเมธอดเปนฟงกการทำางานทรถยนตสามารถทำาได มเพยงแคคลาสนนโปรแกรมยงไมสามารถทำาได ดงนนเราจงตองนำาคลาสนไปสรางออบเจคกอน
การเขยนโปรแกรมเชงวตถนนจะประกอบไปดวยคลาสและออบเจค ออบเจคแตอนจะมตวแปรในการเกบขอมล (variable) และฟงกชนการทำางานของมนหรอเมธอด (method) ตอไปเราจะมาสรางคลาสและออบเจคในภาษา Java
สราง Classesคลาสเปนการกำาหนดสวนประกอบตางๆ ทจะนำาไปสรางออบเจค
คลาสจะประกอบไปดวยสมาชกสองอยางคอ ตวแปร และเมธอด ตวแปรใช
สำาหรบเกบขอมลตางๆ เกยวกบออบเจค และเมธอดเปนการกำาหนดฟงกชนการทำางานของออบเจค นเปนรปแบบการประกาศคลาสในภาษา Javaclass ClassName { // member variables // member methods}
ในการสรางคลาสจะใชคำาสง class และตามดวยชอของคลาสทคณจะสราง ชอคลาสควรเรมตนชอดวยตวใหญและมหลกการตงชอเชนเดยวกบตวแปร ภายในบลอกคำาสงของคลาสจะมสมาชกทเปนทงตวแปรและเมธอด หรออยางใดอยางหนงกได มาดตวอยางการสรางคลาสในภาษา Javaclass Person { public String name; public int age; float speed = 4.0f;
void setSpeed (float newSpeed) { speed = newSpeed; }
float getSpeed () { return speed; }
void run () { System.out.println(name + " is running at speed " + speed + " feet/s."); }}
ในตวอยางดานบน เราสรางคลาสทชอวา Person และในคลาสนสมาชกทเปนตวแปร 3 ตวคอ name เปนตวแปร String สำาหรบเกบ
ชอ age เปนตวแปรแบบ integer สำาหรบเกบอาย และ speed เปนตวแปรแบบ float สำาหรบเกบความเรว และสมาชกแบบเมธอด 3 ตว คอ เมธอด setSpeed() สำาหรบกำาหนดความเรวใหม เมธอด getSpeed() สำาหรบรบคาความเรวไปใชงาน และเมธอด run() เปนเมธอดสำาหรบใหออบเจคทำาการวง ในตวอยางเปนการแสดงขอความ
ในการสรางคลาสหรอ Interfaces ในภาษา Java นน คณสามารถสรางแยกออกเปนไฟลใหมได ในการสรางคลาสจะตองใชคำาสง public และชอของคลาสตองตรงกนกบชอของไฟล เชน คลาสของคณชอวา public class MyClass {... ชอไฟลตองเปน MyClass.java
สรางและใชงาน Objectหลงจากทสรางคลาสแลว ตอไปเปนการนำาคลาสมาสรางออบเจค เรา
จะนำาคลาส Person มาสรางออบเจคสำาหรบตวอยางตอไป
public class ObjectExample { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person();
p1.name = "Mateo"; p1.age = 20; p1.speed = 3.5f;
p2.name = "Danny"; p2.age = 25;
System.out.println("p1 is " + p1.name); System.out.println("He is " + p1.age + " year old.");
System.out.println(p1.name + " has speed " + p1.speed + " feet/s."); p1.run();
System.out.println("\np2 is " + p2.name); System.out.println("He is " + p2.age + " year old."); System.out.println(p2.name + " has speed " + p2.getSpeed() + " feet/s."); p2.run();
p2.setSpeed(5.0f); p2.run();
}}
class Person { public String name; public int age; float speed = 4.0f;
void setSpeed (float newSpeed) { speed = newSpeed; }
float getSpeed () { return speed; }
void run () { System.out.println(name + " is running at speed " + speed + " feet/s."); }}
ในตวอยางเราไดสรางออบเจคจากคลาส Person ดวยคำาสง
Person p1 = new Person(); Person p2 = new Person();
โดย p1 และ p2 นนเปนตวแปรประเภทออบเจคของคลาส Person โดยออบเจคทงสองนนเปนอสระตอกน โดยแตละออบเจคจะมตวแปรและเมธอดเปนของมนเอง ตอมาเราไดกำาหนดคาใหกบออบเจคทงสองดวยคำาสง
p1.name = "Mateo"; p1.age = 20; p1.speed = 3.5f;
p2.name = "Danny"; p2.age = 25;
ในการเขาถงสมาชกของออบเจคนนจะใชเครองหมาย dot (.) แลวตามดวยชอของตวแปรทจะเขาถง เราไดกำาหนดคาตางๆ ใหกบออบเจคทงสอง ในตวอยางเราไมไดกำาหนดคา speed ใหกบออบเจค p2 ดงนนมนจะใช default ทเราไดประกาศไวในคลาสคอ 4.0แสดงผลขอมลแตละออบเจค ออกมา
System.out.println("p1 is " + p1.name); System.out.println("He is " + p1.age + " year old."); System.out.println(p1.name + " has speed " + p1.speed + " feet/s."); p1.run();
System.out.println("\np2 is " + p2.name); System.out.println("He is " + p2.age + " year old.");
System.out.println(p2.name + " has speed " + p2.getSpeed() + " feet/s."); p2.run();
p2.setSpeed(5.0f); p2.run();
จากการแสดงผลในตวอยางนนตรงไปตรงมา เราไดแสดงชอ อาย และความเรวของแตละออบเจคออกมาทางหนาจอ และเราเรยกใชเมธอดดวย เราเรยกใชเมธอด ในตวอยางของออบเจค p2 เราใช run()เพอสงใหออบเจคทำาการรน p2.getSpeed() ในการรบคา speed ออกมา นอกจากนเรายงเปลยนแปลง speed ของออบเจค p2 และใชเมธอด run() อกครงเพอดความเรวของมน
p1 is MateoHe is 20 year old.Mateo has speed 3.5 feet/s.Mateo is running at speed 3.5 feet/s.
p2 is DannyHe is 25 year old.Danny has speed 4.0 feet/s.Danny is running at speed 4.0 feet/s.Danny is running at speed 5.0 feet/s.และขางลางเปนผลลพธของโปรแกรม
Constructor
คอนสตรคเตอร (constructor) นนคอเมธอดพเศษทจะทำางานเมอออบเจคถกสรางขน เรามกใชคอนสตคเตอรในการกำาหนดคาเรมตนใหกบออบเจค ตวอยางการสรางและใชงานคอนสตรคเตอรในภาษา Java
class Person {
public String name; public int age; float speed = 4.0f;
public Person () { }
public Person (String name) { this.name = name; }
public Person (String name, int age) { this.name = name; this.age = age; }
void setSpeed (float newSpeed) { speed = newSpeed; }
float getSpeed () { return speed; }
void run () { System.out.println(name + " is running at speed " + speed + " feet/s."); }}
ในตวอยาง เราไดสรางคอนสตรคเตอรสำาหรบคลาส Person ดวยโดยคอนสตรคเตอรนนจะตองมชอเหมอนคลาสและกำาหนดระดบการเขาถงเปน public เสมอ เราสามารถสรางไดหลายคอนสตรคเตอรซงเราเรยกวา Overloading Constructor เชนเดยวกนกบ Overloading Method
Person p1 = new Person("Mateo");Person p2 = new Person("Marcus", 25);Person p3 = new Person();
สามารถสรางออบเจคในการกำาหนดคาใหกบออบเจคไดทนทในตอนทสรางคอนสตรคเตอร โดยสงอากวเมนตเขาไปในคอนสตรคเตอรและคณสามารถเลอกใชแบบไหนเพราะได เพราะคณไดสราง Overloading Constructor สำาหรบทกแบบแลว
คำาสง thisthis เปนคำาสงสำาหรบการอางถงสมาชกในออบเจคปจจบน สำาหรบ
ตวอยางในคอนสรคเตอรนน เราไดใช this.name นนหมายถง name ของออบเจค ในขณะท name นนจะเปนของเมธอด ถาหากในขอบเขตของโปรแกรมทคณใชนนไมมชอของตวแปรทซำากนคณไมจำาเปนตองใชคำาสง this กได เชนในเมธอด getSpeed() นอกจากนคำาสงนยงถกใชในเรองของ Inheritance
คำาสง staticstatic เปนคำาสงทใชสำาหรบกำาหนดใหตวแปรหรอเมธอด สามารถ
เขาถงไดแบบสาธารณะถาหากประกาศเปน public และถานำาไปใชกบออบเจคจะทำาใหทกออบเจคนนอางถงตวแปรเดยวกน ตวอยางการใชคำาสง staticpublic class ObjectExample { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person();
p1.name = "Mateo"; p1.age = 20;
p2.name = "Danny";
p2.age = 25;
System.out.println("Name: " + p1.name); System.out.println("Age: " + p1.age); System.out.println(StaticMember.NAME_PREFIX + " " + p1.name);
System.out.println("\nName: " + p2.name); System.out.println("Age: " + p2.age); StaticMember.displayName(p2.name); }}
class Person { public String name; public static int age;}
class StaticMember { public static String NAME_PREFIX = "Mr.";
public static void displayName (String name) { System.out.println(NAME_PREFIX + " " + name); }}
ในตวอยางเราไดเปลยนใหตวแปร age ในคลาส Person เปน static ดงนนออบเจคทกออบเจคทถกสรางโดยคลาสน จะใหตวแปรนรวมกน และเราไดสรางคลาส StaticMember โดยมสมาชกเปน static ทงหมด สมาชกของมนสามารถเขาถงไดจากทใดๆ โดย prefix ของคลาสเชน StaticMember.NAME_PREFIX และ StaticMember.displayName() ไดใชในตวอยาง
Name: Mateo
Age: 25Mr. Mateo
Name: DannyAge: 25Mr. Dannyและนเปนผลการทำางานของโปรแกรม คณวาอายของออบเจคทงสองนนมคาเทากบ เพราะมนไดรบการเปลยนแปลงลาสดจากคำาสง p2.age = 25
Encapsulation ในการเขยนโปรแกรมเชงวตถ encapsulation คอการปกปดหรอ
ควบคมการเขาถงขอมลของออบเจคจากภายนอก ซงวธการทใชในการควบคมคอการทำางานผานเมธอดเพอดำาเนนการกบขอมลนน ในภาษา Java และภาษาทสนบสนนการเขยนโปรแกรมเชงวตถภาษาอนๆ นนสามารถใชคณสมบตนในการปกปดสวนประกอบภายในคลาสได
แนวคดของ Encapsulation ทมตวแปรทถกปกปดไวภายในมนเปนคำาพดแบบนามธรรมทจะอธบายความหมายของ
encapsulation ไดอยางชดเจน ยกตวอยางเชน การสงอาหารและในอกไมกนาทตอมาไดรบอาหารทสงไป ไมจำาเปนตองทราบขนตอนในการทจะไดอาหารมา เชน เรมตนดวยพนกงานรบรายการอาหาร ตอไปจดเตรยมสวนประกอบและอปกรณในการทำาอาหาร ลงมอเรมตนทำาอาหารและนำามาบรการ
นเปนสงทเกดขนทไมร และมนไมไดจำาเปนทจะตองทราบ แตมนเกยวกบวารวาตองการอะไร และตองทำาอยางไรเพอใหไดสงนน สำาหรบ encapsulation นนเปนเชนเดยวกน เรยกใชงานเมธอดของคลาสเพอวตประสงคบางอยาง แคทราบวธการเรยกใชมน และผลลพธทไดคออะไรตวอยางการใชงาน encapsulationตอไปมาดตวอยางการพฒนาโปรแกรมทมคณสมบตในการปกปดขอมล ซงเปนโปรแกรมนาฬกานบเวลา
// TestTimer.javapublic class TestTimer { public static void main (String[] args) { Timer time = new Timer(); time.setTime(9, 30, 55);
while (true) { time.increaseTime(); System.out.println(time.getTime());
try { Thread.sleep(1000); } catch (InterruptedException ex) { System.out.println(ex); } } }}
class Timer { public int timeStamp = 0;
private int second = 0; private int minute = 0; private int hour = 0;
public void setTime(int h, int m, int s) { second = s; minute = m; hour = h; timeStamp = (hour * 3600) + (minute * 60) + second; }
public void increaseTime() { timeStamp = (timeStamp + 1) % 86400; updateMembers (); }
private void updateMembers () { second = timeStamp % 60; minute = (timeStamp / 60) % 60; hour = (timeStamp / 3600) % 24; }
public String getTime() { return String.format("%02d:", hour) + String.format("%02d:", minute) + String.format("%02d", second); } }
ในตวอยางเปนโปรแกรมแสดงนาฬกาเหมอนในคอมพวเตอรของเรา เราไดสรางคลาส Timer ซงเปนคลาสของนาฬกา และภายในจะมสมาชกตวแปรทเปน private ไดแก second minute hour และสมาชกเมธอด updateMembers () นนหมายความวาขอมลเหลานถกหอหม เราไมสามารถเขาถงมนไดโดยตรงทางเดยวทเราสามารถทำาไดคอเขาถงขอมลโดยเมธอดหรอตวแปรทเปน public ในคำาสง
time.increaseTime();
เปนการเพมเวลาขนไป 1 วนาท เราทราบวาเมอเมธอดนทำางานเวลาจะเพมขนไป 1 วนาท แตภายในการทำางานของมนวาเปนยงไง เราไมไดทราบ และคำาสงตอไป
System.out.println(time.getTime());
เชนเดยวกน เราทราบวาเมธอดนจะสงคาเวลากลบมาใหเรา และเราไมทราบวามนสงขอมลมาแบบไหน หรอประเภทขอมลทเกบนนเปนแบบใด สงเหลานเองเราเรยกกวา Encapsulation
try { Thread.sleep(1000);} catch (InterruptedException ex) { System.out.println(ex);}
คำาสงนเปนการหยดโปรแกรมเปนเวลา 1 วนาท กอนทจะทำาครงตอไป เพอใหโปรแกรมสมจรงมากขน สำาหรบเรอง exception คณจะไดเรยนภายหลง
09:30:5609:30:5709:30:5809:30:5909:31:0009:31:0109:31:0209:31:0309:31:0409:31:05...
และนเปนผลลพธของโปรแกรม มนจะนบเวลาและแสดงเวลาไปเรอยๆ เพราะเราให infinity loop คณตองออกจากโปรแกรมเพอจบมน
ในความจรง encapsulation นนมอยรอบตวหรอคณใชมนมาแลว เชน เมธอด println() ซงมเบองหลงการทำางานทจะตองทำาการตดตอกบจอภาพ และอนๆ อกมากมาย แตเราใชมนแคเพยงคำาสงเดยวและไดผลลพธออกมา หรอแมกระทงคณขบรถยนตแลวเปลยนเกยร ซงมกลไกลตางๆ ทเกดขนมากกวาทคณเหนบนหนาปด แตมนถกปกปดไว
Inheritance Inheritance เปนคณสมบตในการเขยนโปรแกรมเชงวตถทเรยก
วาคณสมบตการสบทอด โดยทคลาสสามารถสบทอดสมาชกของมนจากคลาสหลก (super class) ไปยงคลาสยอย (delivered class) โดยการสบทอดในภาษา Java นนสมาชกทงหมดจะถกสบทอดไปยงคลาสยอย ยกเวนสมาชกทมระดบการเขาถงเปน private และ constructor ของมน
ในการสบทอดคลาส นอกจากมนจะไดรบสมาชกจากคลาสแมแลว ยงสามารถเพมสมาชกและเมธอดของมนเองได ทำาใหมนมความสามารถเพมมากขน นเปนรปแบบการสบทอดของคลาสในภาษา Java
class DeliveredClass extends SuperClass { ...}ในการสบทอดนนจะใชคำาสง extends โดย SuperClass นนเปนคลาสหลกทจะสบทอดไปยง DeliveredClass
สราง Inheritance คลาส
ตอไปมาดตวอยางของการสยทอดคลาสในภาษา Java เราจะสรางคลาส Person เวอรชนใหมขนมา
class Person { String name; int age;
public Person () { }
public Person (String name, int age) { this.name = name; this.age = age; }
public void introduce () { System.out.println("My name is " + name); }}ในตวอยางเปนคลาส Person ของเรา เราจะใชคลาสนในการสบทอดคณสมบตใหกบคลาสอน ซงหมายความวาคลาสนจะเปน super class
class Artist extends Person { String genre;
public Artist (String name, int age){ this.name = name; this.age = age; }
public void playMusic () { System.out.println(name + " is playing " + genre + " music."); }}
class Athlete extends Person { String sport;
public Athlete (String name, int age){ this.name = name; this.age = age; }
public void playSport () { System.out.println(name + " is playing " + sport + "."); }}ตอมาเราไดสราง delivered class ขนมาดงน
คลาส Artist เปนคลาสทสบทอดมาจากคลาส Person นนหมายความวาสมาชกทงหมดของ Person ยกเวน constructor และสมาชกทเปน private จะไมถกสบทอดมาดวย และเราไดเพมตวแปรใหกบคลาสน คอ genre เปนตวแปรสำาหรบประเภทดนตรทเลน และเมธอด playMusic() เพอเลนดนตรตอมาเปนคลาส Athlete การสบทอดนนเปนเชนเดยวกนกบคลาส Artist เพราะสบทอดมาจากคลาสเดยวกน และเราไดเพมตวแปรใหกบคลาสน คอ sport เปนตวแปรสำาหรบกฬาทเลน และเมธอด playSport() เพอเลนกฬานน
สราง constructor ใหกบคลาสทงสองดวย เพราะวา constructor ไมไดสบทอด ตอมาเปนตวอยางการใชงาน เราคำาโคดทงหมดมารวมกนและทำาการสรางออบเจค
public class InheritanceExample { public static void main (String[] args) { Artist art = new Artist("Marcus", 20); Athlete ath = new Athlete("Danny", 25);
art.genre = "Trip Hop";
ath.sport = "Football";
art.introduce(); art.playMusic();
System.out.println();
ath.introduce(); ath.playSport(); }}
class Person { String name; int age;
public Person () { }
public Person (String name, int age) { this.name = name; this.age = age; }
public void introduce () { System.out.println("My name is " + name); }}
class Artist extends Person { String genre;
public Artist (String name, int age){ this.name = name; this.age = age; }
public void playMusic () { System.out.println(name + " is playing " + genre + " music."); }}
class Athlete extends Person { String sport;
public Athlete (String name, int age){ this.name = name; this.age = age; }
public void playSport () { System.out.println(name + " is playing " + sport + "."); }}ในตวอยางเราไดสรางออบเจคจากคลาสทงสองขนมา และกำาหนดคาคณสงเกตวาในคอนสตรคเตอรของ delivered class ทงสองเราไดใชคำาสง this.name กคอตวแปรทสบทอดมาจาก super คลาส และในเมธอด Main คำาสง art.introduce() และ ath.introduce() คอเมธอดทถกสบทอดมาเชนกน สงเกตวาเราไมตองประกาศอกในตอนสราง delivered class ซงนเปนอกเหตผลหนงทำาใหเราสามารถนำาโคดเดมมาใชได โดยไมตองเขยนใหมทงหมด
My name is MarcusMarcus is playing Trip Hop music.
My name is DannyDanny is playing Football.
และนเปนผลลพธของการรนโปรแกรม
Overriding Super Classในการสบทอดจาก super class มายง delivered class นน
delivered class ยงสามารถ override การทำางานของเมธอดใน super class ได โดยการ override เมธอดในภาษา Java นนจะใชคำาสง @Override นำาหนาเมธอดทตองการ
class Artist extends Person { String genre;
public Artist (String name, int age){ this.name = name; this.age = age; }
@Override public void introduce () { System.out.println("My name is " + name); System.out.println("I'm an artist."); }
public void playMusic () { System.out.println(name + " is playing " + genre + " music."); }}
class Athlete extends Person { String sport;
public Athlete (String name, int age){ this.name = name; this.age = age; }
@Override public void introduce () { System.out.println("My name is " + name); System.out.println("I'm an athlete."); }
public void playSport () { System.out.println(name + " is playing " + sport + "."); }}
จากตวอยางเปนการ override เมธอด introduce() จาก super class เพอใหกลาวคำาทกทายทแตกตางกนออกไปสำาหรบแตอาชพ ตอนนใหคณคดลอกคาสทงสองไปแทนทแบบเดมทไมมการ override แลวรนโปรแกรมดใหม
My name is MarcusI'm an artist.Marcus is playing Trip Hop music.
My name is DannyI'm an athlete.Danny is playing Football.
ซงจะไดผลลพธการทำางานดงดานบน การแนะนำาจะตางกนออกไปสำาหรบแตละคลาส ซงเกดจากการ Override เมธอด introduce()
คณสามารถทำาการ Override เมธอด โดยไมตองใชคำาสง @Override กได คอมไพลเลอรของภาษาจะทราบอตโนมตวาเราทำาการ Override เมอมเมธอดทซำากนกบ super class
คำาสง Superนอกจากคำาสง this ทเปนคำาสงบอกการเขาถงสมาชกในคบาส
ปจจบนแลว คณยงสามารถเขาถงสมาชกหรอ constructor ของ super class ไดโดยการใชคำาสง super มนใชกบคลาสหรอเมธอดทถก Override มาดตวอยางการใชคำาสง super ในภาษา Java
class Artist extends Person { String genre;
public Artist (String name, int age){ super(name, age); }
@Override public void introduce () { super.introduce(); System.out.println("I'm an artist."); }
public void playMusic () { System.out.println(name + " is playing " + genre + " music."); }}
class Athlete extends Person { String sport;
public Athlete (String name, int age){ super(name, age); }
@Override
public void introduce () { super.introduce(); System.out.println("I'm an athlete."); }
public void playSport () { System.out.println(name + " is playing " + sport + "."); }}
จากตวอยางขางบน เราไดใชคำาสง super ใน constructor ของคลาสยอยในคำาสง super(name, age)เพราะมามนมการทำางานเหมอนคลาสแม เราไมจำาเปนตองเขยนใหม ตอมาเราไดใชในเมธอด introduce super.introduce() เพอเรยกการทกทายจาก super class เชนกน เมอคณนำาคลาสขางบนไปรนมนจะไดผลลพธเชนเดยวกนกบตวอยางใน override กอนหนา
Polymorphism Polymorphism คอการทออบเจคสามารถมไดหลายรปแบบ ซง
เกดจากการสบทอดจาก super class และมนยงคงรกษาสภาพและคณสมบตของ super class ไว เชน ผคนในโลก จะมทงนกกฬา นกรอง นกดนตร ซงมนกคอการมหลายรปแบบทางอาชพของบคคล ซงเราสามารถใชคำาวา บคคล ในการอางถงคนในอาชพตางๆ ได ซงเปนแนวคดของ polymorphism ในการเขยนโปรแกรม ซงมนความหมายของมนคอการมไดหลายรปแบบ
ในการเขยนโปรแกรมเชงวตถ Polymorphism นนคอการสรางออบเจคโดยเปนออบเจคทสรางมาจากคลาสทม Super class เดยวกน โดยใน Sub class นนไดมการกำาหนดการทำางานใหมใหกบเมธอดใหตรงกบวตถประสงคของคลาสนน หรอการ Override method หลงจากนน
เราสามารถใช Super class สำาหรบการประกาศตวแปรของออบเจค (class instance) ทสรางออบเจคจาก Sub class ได
ตอไปเปนตวอยางของการใชงานคณสมบต polymorphism ในภาษา Java โดยเราจะมคลาส Person สำาหรบเปน super class และสรางคลาสอนเพอสบทอดจากคลาสน
public class TestPolymorphism {
public static void main (String[] args) {
Person person1, person2, person3; person1 = new Person("Mark", 1980); person2 = new Sheriff("Mateo", 1981, "California"); person3 = new Police("Danny", 1986, "NYC");
person1.introduce(); person2.introduce(); person3.introduce();
}
}
class Person {
String name; int bornYear;
public Person (String name, int bornYear) { this.name = name; this.bornYear = bornYear; }
public void introduce () { System.out.print("My name is " + name + ","); System.out.println(" I was born in " + bornYear + "."); }
}
class Sheriff extends Person {
String workState;
public Sheriff (String name, int bornYear, String workState) { super(name, bornYear); this.workState = workState; }
@Override public void introduce () { super.introduce(); System.out.println("I'm a sheriff and work in " + workState + "."); }
}
class Police extends Person {
String workCountry;
public Police (String name, int bornYear, String workCountry) { super(name, bornYear); this.workCountry = workCountry;
}
@Override public void introduce () { super.introduce(); System.out.println("I'm a police and work in " + workCountry + "."); }
}ในตวอยาง นนเรามคลาส Person ทเปน super class เราไดสราง delivered class มาสองคลาสคอ Sheriff และ Police นนคอเปนคลาสทสบทอดคณสมบตของตวแปรและเมธอดมาจากคลาส Personใน delivered class ทงสอง เราไดทำาการ override เมธอด introduce เพอแสดงขอมลเพมเตม และตอไปเปนการใชงานคณสมบตของ polymorphism ในจากโคด
Person person1, person2, person3;person1 = new Person("Mark", 1980);person2 = new Sheriff("Mateo", 1981, "California");person3 = new Police("Danny", 1986, "NYC");ในตอนน เราไดใชคลาส Person ในการประกาศออบเจค (instances) มา 3 ตวแปร และเราใช instances ของคลาสนในการสรางออบเจคจากคลาสตางๆ ซงกคอ Person, Sheriff และ Police นนหมายความวา ตวแปรทสรางจากคลาส Person นนมไดหลายรปแบบ ในตวอยางนนม 3 แบบดวยกน
person1.introduce();person2.introduce();person3.introduce();
ตอมาเปนการเรยกใชงานเมธอด introduce ของแตละออบเจคซงสรางมาจากคลาสทแตกตางกน สำาหรบ delivered class นนเมธอด introduce ถกทำาการ override เพอใหแสดงขอมลเพมเตมขอไดเปรยบของ polymorphism คอการทสามารถจดการกบออบเจคทสบทอดมาจากคลาสเดยวกนได โดยใช super class ของมนในการประกาศออบเจค
My name is Mark, I was born in 1980.My name is Mateo, I was born in 1981.I'm a sheriff and work in California.My name is Danny, I was born in 1986.I'm a police and work in NYC.และนเปนผลลพธของโปรแกรม
ในการใช instances ทสรางจาก super class สามารถใชไดกบตวแปรหรอเมธอดทมอยใน super class หรอทไดรบการ override เทานน ยกตวอยางเชน ถาคณสรางเมธอดหรอตวแปรใหมใน delivered class คณไมสามารถใชมนไดผาน instance ของ super class ได เราจะพดเกยวกบเรองนในเรอง interface และ abstract class
เพอใหคณเขาใจเกยวกบ Polymorphism มากขน มาดตวอยางในการเขยนโปรมในการใชงานกบอาเรยและการทำางานโดยสงเปนพารามเตอรของฟงกชน
import java.util.ArrayList;
public class Polymorphism {
public static void main(String[] args) {
ArrayList<Shape> shapes = new ArrayList<Shape>(); shapes.add(new Rectangle()); shapes.add(new Triangle());
for (Shape shape : shapes) { drawShape(shape); }
}
public static void drawShape(Shape shape) { shape.draw(); }
}
class Shape {
public void draw() { System.out.println("Perform draw from base class"); }
}
class Rectangle extends Shape {
@Override public void draw() { System.out.println("Draw rectangle"); super.draw(); }
}
class Triangle extends Shape {
@Override public void draw() { System.out.println("Draw triangle"); super.draw(); }
}ในตวอยาง เรามคลาส Shape ในการกำาหนดรปทรง ซงคลาสนมเมธอด draw() เพอเปนการวาดรปทรงในคลาส และตอมาเราไดสรางอกสองคลาสคอ Rectangle และ Triangle ทมการสบทอดมาจากคลาส Shape และทำาการ Override เมธอด draw() เพอใหสอดคลองกบการทำางานของคลาสทงสอง
ArrayList<Shape> shapes = new ArrayList<Shape>();shapes.add(new Rectangle());shapes.add(new Triangle());
for (Shape shape : shapes) { drawShape(shape);}ในการเรมทำางานของโปรแกรม เราไดสราง ArrayList โดยการใชคลาส Shape เปน instance ของออบเจค ดงนนเราจงสามารถนำาไปสรางออบเจคทสบทอดจากจากคลาสนได นนกคอเราไดสรางออบเจคจากคลาส Rectangle และ Triangle และเกบใน ArrayList ดงนน ตวแปร shapes สามารถมไดหลายรปแบบของออบเจคทสบทอดจาดคลาส Shape ซงนเองถอเปนแนวคดของการใชงาน Polymorphism
public static void drawShape(Shape shape) { shape.draw();}
นอกจากน เมธอด drawShape() เปนเมธอดสำาหรบการวาดรปทรงทมพารามเตอรเปน Shape ดงนนเราไมตองสนใจวาออบเจคทสงเขามาจะเปนออบเจคของ Rectangle หรอ Triangle ซงเราสนใจแตสงทเราตองการทำาคอการเรยกใชงานเมธอด draw() ซงกลไกลของ Polymorphism จะเรยกใชงานเมธอดของออบเจคอตโนมต
Draw rectanglePerform draw from base classDraw trianglePerform draw from base classDraw circlePerform draw from base classนเปนผลลพธการทำางานของโปรแกรมในการใชงาน Polymorphism กบอาเรยและเมธอด
Interfaces Interface นนคลายกบคลาส แตภายใน interface จะมไดแคคา
คงท และการประกาศรปแบบของเมธอดเทานน โดยเมธอดทกำาหนดขนจะไมมสวนการทำางานหรอเปนเมธอดวางเปลาทมแคสวนหวของมน interface นนจะตองนำาไปใชรวมกบคลาส กลาวอกนยหนง Interfaces นนเปนการอธบายวาคลาสจะตองมเมธอด และนำาเมธอดเหลานนไปกำาหนดการงานในตอนสรางคลาส การซงเรยกวา Implement interface
ตวอยางในการใช interface มกจะใชกบวาการกำาหนดโครงสรางเมธอดใหกบคลาส และ interface จะไมสามารถนำาไปสรางออบเจคได ในการใชงาน interface จะตองนำาไป implements กบคลาสเทานน ดงนนถาไมมคลาส interface ไมกสามารถทำางานได ดงนนคลาสหลายคลาสอาจจะมการ implements จาก Interfaces เดยวกน
การสราง Interfaces
นเปนรปแบบการประกาศ interfaces ในภาษา Java
interface InterfaceName { ...}ในการประกาศ interface นนจะใชคำาสง interface ตามดวยชอของมน InterfaceName และภายในบลอคคำาสงของ interface จะประกอบไปดวยคาคงท และสวนหวของเมธอดเทานน ตอไปมาดตวอยางการประกาศ interface ในภาษา Java
interface ICar { public void engineStart(); public void changeGear(int newGear); public void turnLeft(); public void turnRight();}จากตวอยางเราไดสราง interface ชอ ICar ขนมา และเมธอด header ภายใน interface ซงเปนการบอกวาคลาสทนำา interface นไปใชงานจะตองมเมธอดเหลานอย ตอไปเราจะนำาไปสรางคลาส
class Car implements ICar {
int gear = 0;
public void engineStart() { // start engine } public void changeGear(int newGear) { // assign new gear } public void turnLeft() {
// turn car to left direction } public void turnRight() { // turn car to right direction }}ในตวอยางเราไดสรางคลาส Car และใชคำาสง implements ตามดวยชอ interface ICar เพอนำามาใชงานสำาหรบคลาสน ภายในคลาส ตอนนเราตองกำาหนดการทำางานในเมธอดทงหมด ทเราไดกำาหนดไวใน interface ทนำามา Implements
Implements Multiple Interfaces
ในภาษา Java คณสามารถนำาหลาย interface มา implements ในการสรางคลาสได นนหมายความวาคณตองกำาหนดการทำางานของเมธอดใหครบทกเมธอดทกำาหนดใน interface ดวยเชนกน โดยคนดวยเครองหมาย commas (,)
class CarName implements Ineterface1, Interface2, ... { ...}
class CarName extends SuperClass implements Ineterface1, Interface2, ... { ...}คณสามารถใชคำาสง extends สำาหรบการสบทอดคลาสรวมกบการ implements interface ไดเชนกน ตอไปมาดตวอยางในการ implement หลาย interface
interface IVolume{
public void increaseVolume(); public void decreaseVolume();}
interface IChanel { public void nextChangel(); public void previousChangel();}
interface INetwork { public void connectNetwork(); public void disconnectNetwork();}เราไดสรางสาม interface ขนมาซงแตละอนนนหมายถงระบบ และภายในระบบจะมเมธอดทจะทำางานอยภายใน โดย interface แตละอนนนจะหมายถงระบบเกยวกบความดงเสยง ระบบเกยวกบชองสญญาณ และระบบของเนตเวรค
class Radio implements IVolume, IChanel { public void increaseVolume() { ... }
public void decreaseVolume() { ... }
public void nextChangel() { ... }
public void previousChangel() { ... }
}
class Computer implements IVolume, INetwork { public void increaseVolume() { ... }
public void decreaseVolume() { ... }
public void connectNetwork() { ... }
public void disconnectNetwork() { ... }}และเราสรางคลาส Radio ซง implement จาก interface IVolume และ IChanel เพราะวาวทยนนมระบบในการเพมลดระดบเสยง และมระบบเปลยนชองสถาน คณจะตองทำาการ override ทกเมธอดทมาจาก interfaceและคลาส Computer ซงจะ implement จาก interfaces IVolume และ INetwork โดยคอมพวเตอรนนจะมระบบเพมลดระดบเสยงเชนกน แตคอมพวเตอรจะมระบบเนคเวรคแทนคณจะเหนวาเราแคเพยงประกาศประเภทของเมธอดไวใน interface การสราง interface เหมอนการวางแผนระบบ การกำาหนดระบบและการงานของมนอยางคราวๆ วามอะไรบาง สวนการนำามา implement คลาสเปนการพฒนาระบบทไดออกแบบไวกอนหนา
Package
Package คอการจดหมวดหมหรอแบงแยกกลมของคลาสใหเปนกลมๆ ซงเรยกวา namespaces เพอใหงายตอการใชงานในการเขยนโปรแกรม หรอการทำาใหโครงสรางของโปรแกรมมระเบยบPackage นนมแนวคดคลายกบ file system ของระบบปฏบตการ ยกตวอยางเชน เราใชโฟลเดอรในการจดเกบไฟลประเภทตางๆ เชนเดยวกนกบ package ในภาษา Java มนทำาหนาทเหมอนโฟลเดอรทรวมคลาสเขาไวดวยกนPackage เหมอนคลาสไลบรารทเกบแยกไวเปนสวนๆ เพอใหงายตอการใชงาน และในภาษา Java กม package ตางๆ ทจำาเปนใหใชมากมาย นอกจากน package ยงสามารถจดเกบในรปแบบของ compressed file ได ซงจะไฟล extension เปน .jar
จากรปดานบนเปนตวอยางของ package ทดในโปรแกรม Netbeans คณจะพบวามนอยในรปแบบของ tree โดยมโฟลเดอร src เปน root ของโปรเจค ในความเปนจรงแลว package กคอโฟลเดอรทถกเกบอยใน directory ของโปรเจคนนเอง
สราง Package ในภาษา Java
ในการสราง package ในภาษา Java อยางทเราไดบอก package นนถกสรางเปน directory ในโฟลเดอรโปรเจคของเรา เชน คณสรางโปรเจคของคณไวท D:/project/MarcusCode/src/ คณสามารถสราง package ทงหมดไดภายในโฟลเดอร src เพราะมนคอ directory root ของโปรเจค
อกวธหนงซงเปนวธหลกและงายตอการสราง package คอการสรางใน IDE ทคณใชเขยนโปรแกรม เชน ในโปรแกรม Netbeans คลกขวาท โปรเจคแลวเลอก New -> Java Package...
รปตวอยางการสราง package ในโปรแกรม Netbeans
package ถกออกแบบมาเพอจดเกบคลาสตางๆ ใหเปนหมวดหม เราสามารถแยกคลาสแตละคลาสออกเปนคลาสยอยๆ ได ซงการแบงโปรแกรมเปนไฟลยอยๆ จะทำาใหโปรแกรมทำางานไดเรวขน เพราะเราเรยกใชแคคลาสทจำาเปนเทานน
สรางคลาสภายใน package
คลาสทอยภายใน package จะตองกำาหนด package ของมนในบรรทดแรกเสมอ ตวอยางตอไปเราจะสรางคลาสสำาหรบการแปลงคาของความยาว
//LengthConvert.javapackage unit.convert.length;
public class LengthConvert { public static float meterToFeet (float m) { return m * 3.28084f; } public static float centimeterToinch (float centi) { return centi * 0.393701f; }}ในตวอยาง เราไดสรางคลาส LengthConvert ซงอยภายใน package unit.convert.length ซงเปน package ทซอนกนอย เราใชเครองหมายจด (*) ในกรณมนซอนกน เราไดกำาหนด package ดวยคำาสง
package unit.convert.length;
คำาสงนเปนการบอก Java คอมไพเลอรใหทราบคลาสนถกกำาหนดใหอยภายใน package unit.convert.length
คำาสง import package
ในการใชงาน package ในภาษา Java นนจะใชคำาสง import เพอนำาเขาคลาสภายใน package เขามาในโปรแกรมของเรา มนมรปแบบการใชงานดงน
import package_name.ClassName; // import a class to programimport package_name.*; // import all classes to program
จากรปแบบการใชงานดานบน คณสามารถ import คลาสทระบหรอทงหมดภายใน package กไดโดยใชเครองหมาย (*) แทนชอของคลาสจากคลาสและ package ทเราไดสรางในตวอยางกอนหนา ตอไปเราจะสรางโปรแกรมทจะใชงานคลาสทอยภายใน package นน
// Main.javaimport unit.convert.length.LengthConvert;
public class Main { public static void main (String[] args) { System.out.println("1 meter equal " + LengthConvert.meterToFeet(1) + " feets"); System.out.println("14 meters equal " + LengthConvert.meterToFeet(14) + " feets"); System.out.println("5 centimeter equal " + LengthConvert.centimeterToinch(5) + " inches"); }}ในตวอยางเราไดสราง ไฟลโปรแกรมหลกทชอวา Main.java เราได import คลาสเขามาในโปรแกรมดวยคำาสง
import unit.convert.length.LengthConvert;
ซงทำาใหเราสามารถใชงานคลาสนไดเหมอนกบมนอยใน package หรอไฟลเดยวกน รปภาพขางลางแสดงโครงสรางของโปรเจคน
คลาสทถกสรางใน directory root เชนในตวอยาง คลาส Main.java จะถอวาเปน default package (หรอไมม package) ทำาใหเราไมตองกำาหนด package ใหมนในตอนแรก จากบทเรยนหอนหนาของเรา เราสรางใน directory root ทงหมด นนเปนเหตผลวาทำาไมเราจงไมไดกำาหนด package เหมอนคลาส LengthConvert.java
Access Modifiers ในภาษา Java ซงเปนคำาสงทใชกำาหนดการเขาถงในโปรแกรม
Access Modifiers เปนคำาสงในการควบคมระดบการเขาถงของตวแปรหรอเมธอดทอยภายในคลาส เหมอนทคณไดเหนในการสรางคลาสหลก ชอของคลาสและไฟลตองตรงกน และตองกำาหนดการเขาถงใหเปนแบบ public ซงทำาใหคลาสนสามารถเขาถงไดจากททกของโปรแกรม นอกจากน Access Modifiers ยงเปนคำาสงทใชในการกำาหนดการเขาถงของออบเจคตางๆ ใน Package เชน คลาส และ Interfaces เปนตน
ตอมาเราจะมาพดถงระดบสมาชก (member level) ซงมนจะมาพรอมกบการกระกาศตวแปรทคณเคยเหนในตวอยางกอนหนาแลว เชน
private int width;private int height;
public int calArea () { return width * height;}ในภาษา Java นนมคำาสงในการควบคมระดบการเขาถงอย 4 ระดบดวยกน คอ public, protected, private และ no modifier (ไมตองกำาหนด) โดยแตละรปแบบนนมความหมายดงน
public: คลาสหรอสมาชกสามารถเขาถงไดจากทสวนของโปรแกรม
protected: คลาสหรอสมาชกสามารถเขาถงไดภายใน package เดยวกนและ sub class ของมน
no modifier (ไมกำาหนด): คลาสหรอสมาชกสามารถเขาถงไดภายใน package เดยวกน และภายในคลาสเดยวกนเทานน
private: คลาสหรอสมาชกสามารถเขาถงไดภายในคลาสเดยวกนเทานน
จากคำาอธบายขางบน เราสามารถนำามาเขยนเปนตารางการเขาถงของคำาสงทงหมดไดดงน โดยท public เปนการเขาถงทเปนสาธารณะมากทสด และ private นนปดกนทสด
Modifiers Class Package
Sub class
World
public Yes Yes Yes Yesprotected Yes Yes Yes Nono modifier Yes Yes No Noprivate Yes No No Noตอไปมาดตวอยางการใชงาน Access Modifier กบการเขยนโปรแกรมในภาษา Java
public class TestFruit {
public static void main (String[] args) { Fruit fr = new Fruit(); fr.name = "Grape"; fr.flavor = "sour"; fr.setColor("green");
System.out.println("Fruit name: " + fr.name); System.out.println("Flavor: " + fr.flavor); System.out.println("Color: " + fr.getColor()); }}
class Fruit { public String name; String flavor; private String color;
public String getColor () { return color; } public void setColor (String c) { color = c; }}ในตวอยาง เปนการใช access modifier แบบตางๆ ในตอนแรก เราไดสรางคลาส Fruit ทมสมาชกทงตวแปรและเมธอดทมระดบการเขาถงในแบบตางๆ
Fruit fr = new Fruit();fr.name = "Grape";fr.flavor = "sour";fr.setColor("green");
ตอมาเราสรางออบเจค Fruit ทมชอวา fr โดยคณสงเกตวาออบเจคทเราสรางนนอยในคลาส TestFruit นนหมายความวาเราไมสามารถเขาถงตวแปร color ได เพราะมนม access modifier แบบ private ซงสามารถเขาถงไดภายในคลาสเทานน เราจงเขาถงมนผาน public เมธอด getColor ()และ setColor () ซงอยภายในคลาสเดยวกนสำาหรบตวแปร name และ flavor เราสามารถเขาถงไดผานตวแปรออบเจคโดยตรง เพราะพวกเขาม access modifier เปนแบบ public ซงสามารถเขาถงจากภายนอกได
Fruit name: GrapeFlavor: sourColor: greenและนเปนผลลพธของโปรแกรม
การเขาถงแบบ Publicตอไปเปนตวอยางเพมเตมในการใช Access modifiers รปแบบตางๆ ในการกำาหนดการเขาถงของโปรแกรมภายในคลาส โดยเราจะเรมกบคำาสง public ซงเปนการกำาหนดการเขาถงแบบสาธารณะ
class Person {
public String firstName; public String lastName; protected int age; private int height;
public String getFullname() { return firstName + " " + lastName; }
public void setHeight(int h) { height = h; }
public int getHeight() { return height; }
}
public class PublicExample { public static void main(String[] args) {
Person p1 = new Person(); p1.firstName = "Shawn"; p1.lastName = "Roberts"; p1.age = 32; p1.setHeight(178);
System.out.println(p1.getFullname()); System.out.println("Age " + p1.age + " years"); System.out.println("Height " + (p1.getHeight() / 100.0f) + " m");
}}ในตวอยาง เราไดสรางคลาส Person สำาหรบเกบขอมลของบคคล ทประกอบไปดวยตวแปร firstName และ lastName ทมการกำาหนดการเขาถงเปนแบบ public และเมธอดภายในคลาสนนเปนแบบ public ทงหมด จงทำาใหพวกมนสามารถเขาถงผานออบเจคได เชน p1.firstName เปนตน
การเขาถงแบบ Protected และ Private
ตอไปเปนการใชงานตวแปร age ซงมการกำาหนดการเขาถงแบบ protected การกำาหนดการเขาถงแบบนใชกบการใชงานในการสบทอดของคลาส
เมอคณไดทำาการสบทอดคลาสใดๆ สมาชกทงหมดของคลาสยกเวนทมการกหนดการเขาถงเปนแบบ Private จะไมถกสบทอด ดงนนในตวอยางเราไมสามารถเขาถงสมาชกทเปน Private ผานตวแปรออบเจค p1 ได
Shawn RobertsAge 32 yearsHeight 1.78 mนเปนผลลพธการทำางานของโปรแกรม ในการกำาหนดการเขาถงของโปรแกรม
http://marcuscode.com/lang/java