54
บบบบบ 13 บบบบบบบบบบบบบบบบบบบบบบบบ กกกกกกกกกกกกกกกกกกกกกกกก (Object-oriented programming, OOP) กกกกกก Java กกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกก Procedural programming กกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกก Java กกกก Inheritance Encapsulation กกก Polymorphism บบบบบบบบบบบบบบบบบบบบบบบบ กกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกก 2 กกก กกก กกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกก กกกกกกกกกกกก กกกกกกกกกกกกกกกกกก instances กกก กกกก กกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกก กกกก Java C++C# Python PHP Ruby กกก กกกกกกกกก กกกก Java กกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก กกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก Procedural programming

สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

บทท 13การเขยนโปรแกรมเชงวตถ

การเขยนโปรแกรมเชงวตถ (Object-oriented programming, OOP) ในภาษา Java ซงเปนรปแบบในการเขยนโปรแกรมทสำาคญในปจจบน หรอเปนการพฒนาจากการเขยนโปรแกรมแบบเดมทเราคณเคยกนคอ Procedural programming และเราจะแนะนำาใหคณรจกกบสมบตหลกทสำาคญในการเขยนโปรแกรมเชงวตถในภาษา Java เชน Inheritance Encapsulation และ Polymorphism

การเขยนโปรแกรมเชงวตถ การเขยนโปรแกรมเชงวตถ เปนรปแบบการเขยนโปรแกรมทใช

แนวคดของออบเจค ซงในออบเจคนนจะประกอบไปดวยสมาชก 2 แบบ คอ ตวแปรซงเปนขอมลหรอกำาหนดคณลกษณะของออบเจค และเมธอด เปนฟงกชนการทำางานทออบเจคสามารถทำาได ในการสรางออบเจคนนจะอยภายใตการกำาหนดของคลาส โดยคลาสคอการกำาหนดวาออบเจคจะมสมาชกอะไรบาง และกำาหนดการทำางานของเมธอด ดงนนออบเจคจะสรางจากคลาส เราเรยกออบเจควา instances ของคลาส

ภาษาตางๆ เปนจำานวนมากสนบสนนการเขยนโปรแกรมเชงวตถ เชน Java C++C# Python PHP Ruby และภาษาอนๆ ซง Java ถอวาเปนภาษาของออบเจคอยางเตมรปแบบ การเขยนโปรแกรมเชงวตถนนเปนการพฒนารปแบบของการเขยนโปรแกรมไปอกขนจากการเขยนโปรแกรมแบบเดมทเราเคยเขยนคอ Procedural programming

คณสมบตของ OOP

Page 2: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

การเขยนโปรแกรมเชงวตถ มขอดและขอไดเปรยบจากการเขยนโปรแกรมแบบเดมมากมาย ซงสงทสำาคญทสดของมนคอการนำาโคดของโปรแกรมกลบมาใชใหม และคณสมบตอนๆ ดงน

Code reuse: การนำาโคดกลบมาใชใหม ไดอยางมประสทธภาพ Maintenance: งายตอการบำารงรกษาและปรบปรง แตละคลาส

จะมขอบเขตการทำางานและเมธอดของมนเอง Classes: คลาสทสรางขนนน สามารถนำาไปสรางเปนออบเจคไดไม

จำากด และแตละออบเจคมสมาชกเปนของมนเอง Inheritance: คณสมบตการสบทอด คลาสสามารถสบทอดจาก

คลาสอนได ซงเปนการ reuse code และพฒนาตอเดมความสามารถจากคลาสเดมทมอย

Polymorphism: คณสมบตของออบเจคทหลากหลายรปแบบ ซงสามารถจดการไดจาก Base คลาสของมน

Encapsulation: เปนคณสมบตการหอหม เปนแนวคดแบบนามธรรมทวาคณไมจำาเปนตองรวาเมธอดหรอในคลาสนนทำางานยงไง แตมนสามารถทำางานไดสำาเรจและใหผลลพธแกคณได

Abstraction: คอการอธบายการทำางานของคลาสและเมธอดในแบบนามธรรม เพอนำาไปใชสำาหรบออบเจคทมการทำางานแตกตางกน เชน เราบอกวาสตวสามารถเคลอนท การเคลอนทคอการบอกอยางเปนนามธรรม เพราะวาสตวแตละตวมวธการเคลอนททแตกตางกน เชน สนขจะเดน นกจะบน สวนเตาจะคลาน เปนตน

ขางบนนนเปนคณสมบตของการเขยนโปรแกรมแบบออบเจค ทมความสำาคญและมนใชกบการเขยนโปรแกรมในขนสง อยางไรกตามในบทน คณจะไดเรยนรเกยวกบมนทงหมด

คลาสและออบเจคสวนประกอบของการเขยนโปรแกรมเชงวตถทสำาคญคอ คลาสและ

ออบเจค ในตอนแรกเราตองสรางหรอประกาศคลาสขนมา ซงประกอบไป

Page 3: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ดวยตวแปร และเมธอดในการทำางาน หลงจากนนเราจะนำาไปสรางออบเจค การสรางคลาสกเหมอนการออกแบบรปแบบของวตอยางหนงทเราจะสรางขนมา เชน คณจะสรางรถขนมาเรากตองเขยนแบบ เราเรยกสงนวาคลาส และเรานำาไปสรางรถ ซงกคอออบเจค

ในตวอยางเปนรปทแสดงใหเหนถงรายละเอยดของรถทนำามาสรางเปนคลาส จะเหนไดวาจะม attribute เมธอดเพออธบายเกยวกบรถ ซงรถกจะมคณสมบตของมน เชน จำานวนเชอเพลง ความเรวสงสด และอน และสวนของการทำางาน จะเปนการเตมนำามน การเพมและลดความเรว การขบเคลอนรถออกไป และสตารทหรอหยดเครองยนต เปนตน ซงสงเหลานจะถกกำาหนดไวในคลาส

ตวอยางของการประกาศคลาสในภาษา Java เราจะประกาศคลาส Car ซงจะประกอบไปดวยคณสมบต และเมธอดการทำางาน

public class Car {

public float fuel; public int maxSpeed; public int currentSpeed = 0; public String color;

public void reFuel() {

Page 4: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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คลาสเปนการกำาหนดสวนประกอบตางๆ ทจะนำาไปสรางออบเจค

คลาสจะประกอบไปดวยสมาชกสองอยางคอ ตวแปร และเมธอด ตวแปรใช

Page 5: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

สำาหรบเกบขอมลตางๆ เกยวกบออบเจค และเมธอดเปนการกำาหนดฟงกชนการทำางานของออบเจค นเปนรปแบบการประกาศคลาสในภาษา 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 สำาหรบเกบ

Page 6: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ชอ 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.");

Page 7: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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."); }}

Page 8: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ในตวอยางเราไดสรางออบเจคจากคลาส 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.");

Page 9: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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 {

Page 10: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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

Page 11: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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";

Page 12: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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

Page 13: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

Age: 25Mr. Mateo

Name: DannyAge: 25Mr. Dannyและนเปนผลการทำางานของโปรแกรม คณวาอายของออบเจคทงสองนนมคาเทากบ เพราะมนไดรบการเปลยนแปลงลาสดจากคำาสง p2.age = 25

Encapsulation ในการเขยนโปรแกรมเชงวตถ encapsulation คอการปกปดหรอ

ควบคมการเขาถงขอมลของออบเจคจากภายนอก ซงวธการทใชในการควบคมคอการทำางานผานเมธอดเพอดำาเนนการกบขอมลนน ในภาษา Java และภาษาทสนบสนนการเขยนโปรแกรมเชงวตถภาษาอนๆ นนสามารถใชคณสมบตนในการปกปดสวนประกอบภายในคลาสได

แนวคดของ Encapsulation ทมตวแปรทถกปกปดไวภายในมนเปนคำาพดแบบนามธรรมทจะอธบายความหมายของ

encapsulation ไดอยางชดเจน ยกตวอยางเชน การสงอาหารและในอกไมกนาทตอมาไดรบอาหารทสงไป ไมจำาเปนตองทราบขนตอนในการทจะไดอาหารมา เชน เรมตนดวยพนกงานรบรายการอาหาร ตอไปจดเตรยมสวนประกอบและอปกรณในการทำาอาหาร ลงมอเรมตนทำาอาหารและนำามาบรการ

Page 14: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

นเปนสงทเกดขนทไมร และมนไมไดจำาเปนทจะตองทราบ แตมนเกยวกบวารวาตองการอะไร และตองทำาอยางไรเพอใหไดสงนน สำาหรบ 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;

Page 15: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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();

Page 16: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

เปนการเพมเวลาขนไป 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...

Page 17: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

และนเปนผลลพธของโปรแกรม มนจะนบเวลาและแสดงเวลาไปเรอยๆ เพราะเราให infinity loop คณตองออกจากโปรแกรมเพอจบมน

ในความจรง encapsulation นนมอยรอบตวหรอคณใชมนมาแลว เชน เมธอด println() ซงมเบองหลงการทำางานทจะตองทำาการตดตอกบจอภาพ และอนๆ อกมากมาย แตเราใชมนแคเพยงคำาสงเดยวและไดผลลพธออกมา หรอแมกระทงคณขบรถยนตแลวเปลยนเกยร ซงมกลไกลตางๆ ทเกดขนมากกวาทคณเหนบนหนาปด แตมนถกปกปดไว

Inheritance Inheritance เปนคณสมบตในการเขยนโปรแกรมเชงวตถทเรยก

วาคณสมบตการสบทอด โดยทคลาสสามารถสบทอดสมาชกของมนจากคลาสหลก (super class) ไปยงคลาสยอย (delivered class) โดยการสบทอดในภาษา Java นนสมาชกทงหมดจะถกสบทอดไปยงคลาสยอย ยกเวนสมาชกทมระดบการเขาถงเปน private และ constructor ของมน

ในการสบทอดคลาส นอกจากมนจะไดรบสมาชกจากคลาสแมแลว ยงสามารถเพมสมาชกและเมธอดของมนเองได ทำาใหมนมความสามารถเพมมากขน นเปนรปแบบการสบทอดของคลาสในภาษา Java

class DeliveredClass extends SuperClass { ...}ในการสบทอดนนจะใชคำาสง extends โดย SuperClass นนเปนคลาสหลกทจะสบทอดไปยง DeliveredClass

สราง Inheritance คลาส

ตอไปมาดตวอยางของการสยทอดคลาสในภาษา Java เราจะสรางคลาส Person เวอรชนใหมขนมา

Page 18: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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;

Page 19: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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";

Page 20: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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; }

Page 21: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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.

Page 22: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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;

Page 23: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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

Page 24: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

คำาสง 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

Page 25: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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 หลงจากนน

Page 26: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

เราสามารถใช 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; }

Page 27: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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;

Page 28: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

}

@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();

Page 29: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ตอมาเปนการเรยกใชงานเมธอด 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) {

Page 30: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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(); }

}

Page 31: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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();}

Page 32: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

นอกจากน เมธอด 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

Page 33: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

นเปนรปแบบการประกาศ 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() {

Page 34: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

// 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{

Page 35: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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() { ... }

Page 36: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

}

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

Page 37: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

Package คอการจดหมวดหมหรอแบงแยกกลมของคลาสใหเปนกลมๆ ซงเรยกวา namespaces เพอใหงายตอการใชงานในการเขยนโปรแกรม หรอการทำาใหโครงสรางของโปรแกรมมระเบยบPackage นนมแนวคดคลายกบ file system ของระบบปฏบตการ ยกตวอยางเชน เราใชโฟลเดอรในการจดเกบไฟลประเภทตางๆ เชนเดยวกนกบ package ในภาษา Java มนทำาหนาทเหมอนโฟลเดอรทรวมคลาสเขาไวดวยกนPackage เหมอนคลาสไลบรารทเกบแยกไวเปนสวนๆ เพอใหงายตอการใชงาน และในภาษา Java กม package ตางๆ ทจำาเปนใหใชมากมาย นอกจากน package ยงสามารถจดเกบในรปแบบของ compressed file ได ซงจะไฟล extension เปน .jar

จากรปดานบนเปนตวอยางของ package ทดในโปรแกรม Netbeans คณจะพบวามนอยในรปแบบของ tree โดยมโฟลเดอร src เปน root ของโปรเจค ในความเปนจรงแลว package กคอโฟลเดอรทถกเกบอยใน directory ของโปรเจคนนเอง

สราง Package ในภาษา Java

Page 38: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ในการสราง package ในภาษา Java อยางทเราไดบอก package นนถกสรางเปน directory ในโฟลเดอรโปรเจคของเรา เชน คณสรางโปรเจคของคณไวท D:/project/MarcusCode/src/ คณสามารถสราง package ทงหมดไดภายในโฟลเดอร src เพราะมนคอ directory root ของโปรเจค

อกวธหนงซงเปนวธหลกและงายตอการสราง package คอการสรางใน IDE ทคณใชเขยนโปรแกรม เชน ในโปรแกรม Netbeans คลกขวาท โปรเจคแลวเลอก New -> Java Package...

รปตวอยางการสราง package ในโปรแกรม Netbeans

package ถกออกแบบมาเพอจดเกบคลาสตางๆ ใหเปนหมวดหม เราสามารถแยกคลาสแตละคลาสออกเปนคลาสยอยๆ ได ซงการแบงโปรแกรมเปนไฟลยอยๆ จะทำาใหโปรแกรมทำางานไดเรวขน เพราะเราเรยกใชแคคลาสทจำาเปนเทานน

สรางคลาสภายใน package

Page 39: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

คลาสทอยภายใน 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 เขามาในโปรแกรมของเรา มนมรปแบบการใชงานดงน

Page 40: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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 หรอไฟลเดยวกน รปภาพขางลางแสดงโครงสรางของโปรเจคน

Page 41: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

คลาสทถกสรางใน 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;

Page 42: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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 {

Page 43: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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");

Page 44: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

ตอมาเราสรางออบเจค 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; }

Page 45: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

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 การกำาหนดการเขาถงแบบนใชกบการใชงานในการสบทอดของคลาส

Page 46: สร้าง Classes · Web viewจากการแสดงผลในต วอย างน นตรงไปตรงมา เราได แสดงช อ อาย

เมอคณไดทำาการสบทอดคลาสใดๆ สมาชกทงหมดของคลาสยกเวนทมการกหนดการเขาถงเปนแบบ Private จะไมถกสบทอด ดงนนในตวอยางเราไมสามารถเขาถงสมาชกทเปน Private ผานตวแปรออบเจค p1 ได

Shawn RobertsAge 32 yearsHeight 1.78 mนเปนผลลพธการทำางานของโปรแกรม ในการกำาหนดการเขาถงของโปรแกรม

http://marcuscode.com/lang/java