การเขียนโปรแกรมภาษาจาวาตอนที่ ๓

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
โครงสร้างโปรแกรมภาษา JAVA
Advertisements

C# เบื้องต้น ก่อนการเขียนเกมด้วย XNA
Suphot Sawattiwong Function ใน C# Suphot Sawattiwong
Component องค์ประกอบของ GUI.
การจัดการความผิดพลาด
Object and classes.
05_3_Constructor.
Object-Oriented Programming
Object Oriented Programing
ปฏิบัติการครั้งที่ 9 ฟังก์ชัน.
ครั้งที่ 7 Composition.
หลักการเชิงวัตถุ อาจารย์ศิริพร ศักดิ์บุญญารัตน์
Arrays.
Selected Topics in IT (Java)
Network programming Asst. Prof. Dr. Choopan Rattanapoka
การสืบทอด (Inheritance)
การเขียนโปรแกรมเชิงวัตถุ ด้วยภาษาจาวา
LOGO Array. ประเภทของ Array - อาเรย์ 1 มิติ (One) - อาเรย์ 2 มิติ (Two) - อาเรย์ 3 มิติ (Three) 2.
บทที่ 3 Class and Object (1) การสร้างและการใช้งานคลาส
คลาสและวัตถุ (2) (Class & Object)
บทที่ 1 หลักการเขียนโปรแกรมเชิงวัตถุ
คลาสและวัตถุ (2) (Class & Object)
คลาสและวัตถุ (4) (Class & Object)
คลาสและวัตถุ (3) (Class & Object). w5_000.rar การใช้งานเมธอดภายในคลาสเดียวกัน ข้อ 24, 25 as5_000.rar การใช้งานเมธอดภายในคลาสเดียวกัน ข้อ 23 2.
บทที่ 4 Method (1).
การสืบทอดคุณสมบัติ (Inheritance)
OOP (Object-Oriented Programming)
Lecture 9 Class (คลาส) To do: Hand back assignments
Inheritance การสืบทอดคลาส
String Class มหาวิทยาลัยเนชั่น การโปรแกรมเชิงวัตถุด้วยภาษา JAVA
input from keyboard มหาวิทยาลัยเนชั่น การโปรแกรมเชิงวัตถุด้วยภาษา JAVA
Page: 1 การโปรแกรมเชิงวัตถุด้วยภาษา JAVA บุรินทร์ รุจจนพันธุ์.. ปรับปรุง 15 มิถุนายน 2550 Structure Programming มหาวิทยาลัยเนชั่น.
Page: 1 การโปรแกรมเชิงวัตถุด้วยภาษา JAVA บุรินทร์ รุจจนพันธุ์.. ปรับปรุง 3 มิถุนายน 2550 Method of Class มหาวิทยาลัยเนชั่น.
Page: 1 การโปรแกรมเชิงวัตถุด้วยภาษา JAVA บุรินทร์ รุจจนพันธุ์.. ปรับปรุง 22 มิถุนายน 2550 ความผิดพลาดที่พบ บ่อย มหาวิทยาลัยเนชั่น.
บทที่ 8 อาร์เรย์.
บทที่ 6 เมธอด.
JAVA PROGRAMMING PART IV.
Handling Exceptions & database
เมธอดคือหน้าที่การงานของวัตถุให้เรียกใช้
Liang, Introduction to Java Programming, Sixth Edition, (c) 2007 Pearson Education, Inc. All rights reserved Java Programming Language.
ความสัมพันธ์ระหว่างคลาส (Class Relationship)
Object Oriented Programming Handling Exceptions
Method of Class อ.สุพจน์ สิงหัษฐิต
สำนักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา
Lec03 :: หลักการเชิงออปเจ็ค (Object Oriented Concept)
Lec05 :: การสืบทอด (inheritance)
Object-Oriented Programming
บทที่ 3 Class and Object (2).
คำสั่งรับค่าและฟังก์ชันทางคณิตศาสตร์
บทที่ 4 คำสั่งควบคุมแบบมีทางเลือก
Java collection framework
Java Programming Java Structure and Datatype,Variable
สายอักขระ เขียนโปรแกรม Java เบื้องต้น.
Object Oriented Programming : OOP
การสืบทอด (inheritance)
chapter5 - คลาสนามธรรม - อินเตอร์เฟสคลาส
TECH30201 Object-Oriented Programming
Inheritance และ Encapsulation.  การสร้างหรือพัฒนาคลาสใหม่จากคลาสเดิมที่ มีอยู่แล้ว  คลาสใหม่จะนำแอตทริบิวต์และเมธอดของ คลาสเดิมมาใช้  เป็นการถ่ายทอดคุณสมบัติจากคลาสหนึ่งสู่อีก.
Object-Oriented Programming
การจัดการกับความผิดปกติ
บทที่ 6 ตัวแปรชุดและ สตริง รายวิชา ง การเขียนโปรแกรมเชิง วัตถุ Reading: ใบความรู้ บทที่ 6.
เริ่มต้นเขียนโปรแกรมภาษาจา วา (Introduction to JAVA Programming)
Chapter 6 Abstract Class and Interface
บทที่ 3 การสืบทอด (Inheritance)
Object and classes.
Inheritance and Method Overriding
Object-Oriented Programming Paradigm
Abstract Class and Interface
Method and Encapsulation
Class Inheritance and Interfaces.
ใบสำเนางานนำเสนอ:

การเขียนโปรแกรมภาษาจาวาตอนที่ ๓

ความรู้เรื่องคลาสและวัตถุ เมื่อเราได้สร้างคลาสขึ้นมา สิ่งที่เราจะประกาศได้จากคลาสคือ ตัวแปรอ้างอิง (reference) และ วัตถุ (instance) reference instance data data method อ.รัชดาพร คณาวงษ์

ตัวอย่างซูเปอร์คลาสและซับคลาส สมมุติว่าเรามีคลาสเริ่มต้นเป็น คลาสชื่อ Shape บอกลักษณะของรูปเรขาคณิตของวัตถุ 2 มิติ มีคลาส Square บอกลักษณะของสี่เหลี่ยม และคลาส Triangle บอกลักษณะของสามเหลี่ยม ที่สืบทอดลักษณะมาจากคลาส Shape อ.รัชดาพร คณาวงษ์

inheritance & overriding class Figure { double width, height; String name; Figure(double w, double h, String n) { width = w; height = h; name = n; } public String getName() { return name;} public double getArea() { return 0.0;} public void setWidth(double w) { width = w; } public void setHeight(double h) { height = h;} อ.รัชดาพร คณาวงษ์

inheritance & overriding class Rectangle extends Figure { Rectangle(double w, double h) { super(w,h,”rectangle”); } double getArea() { return width*height;} class Triangle extends Figure { Triangle(double w, double h) { super(w,h,”triangle”); double getArea() { return 0.5*widht*height;} อ.รัชดาพร คณาวงษ์

Polymorphism class PolyEx { static void compute(Figure x) { System.out.println(x.getName()+” is”); System.out.println(x.getArea()); } public static void main(String args[]){ compute(new Figure(1, 1, “undefined”); compute(new Triangle(1, 1)); compute(new Rectangle(1, 1)); อ.รัชดาพร คณาวงษ์

Polymorphism class A { void print() { System.out.println(“Im A”); } } class B1 extends A { void print() { System.out.println(“Im B1”);} class B2 extends A { void print() { System.out.println(“Im B2”);} class Other { void call(A a) { a.print(); } public static void main(String args[]){ call(new A()); call(new B1()); call(new B2()); อ.รัชดาพร คณาวงษ์

Polymorphism Call(A) print(A) print(B1) print(B2) class A class B1 อ.รัชดาพร คณาวงษ์

Astract Classes จะเห็นว่า คลาส Figure เป็นคลาสแม่ ซึ่งไม่ค่อยจะมีรายละเอียดที่แน่นอนเท่าใด อย่างเช่น method getArea ที่คืนค่า 0 เพราะไม่สามารถบอกได้นั่นเอง ดังนั้น เราจึงไม่ควรจะสร้าง instance ใด ๆ จากคลาส Figure Class ที่ไม่เห็นรูปลักษณ์ที่ชัดเจน เช่นนี้ เราสามารถสร้างให้เป็นแม่แบบไว้ก่อนโดยไม่ระบุตัวโปรแกรมได้ ด้วยกลไก Astract Classes อ.รัชดาพร คณาวงษ์

Astract Classes ใช้ keyword “abstract” ไว้หน้า class และ method member ของคลาสนั้น Method member ที่มีคำว่า abstract ไม่ต้องมีตัวโปรแกรม Class ใด ๆ ที่มี abstract method อย่างน้อย หนึ่ง ต้องเป็น abstract class เสมอ Abstract Class ไม่สามารถนำไปสร้าง instance ได้ แต่สร้าง reference ได้ อ.รัชดาพร คณาวงษ์

Astract Classes ตัวอย่าง abstract class abstract class One { void printName() { System.out.println(“One”); } abstract void greet(); } abstract class Two { void printName() { System.out.println(“Two”); } อ.รัชดาพร คณาวงษ์

Astract Classes ตัวอย่าง การสร้าง class จาก abstract class class SubOne extends One { void greet() { System.out.println(“Hello”); } } class SubTwo extends Two { } class Abstract2 { static public void main(String args[]) { // new One(); // new Two(); (new SubOne()).greet(); (new SubTwo()).printName(); อ.รัชดาพร คณาวงษ์

Astract Classes ตัวอย่างการ implement abstract methods ไม่ครบ abstract class One { abstract void greet1(); abstract void greet2(); } abstract class Two extends One { void greet1() { System.out.println(“Hello”); } class Three extends Two { void greet2() { System.out.println(“Hi”); } อ.รัชดาพร คณาวงษ์

Astract Classes abstract class One { abstract void greet1(); } abstract class Two extends One { void greet1() { System.out.println(“Hello”); } class Three extends Two { void greet2() { System.out.println(“Hi”); } class Abstract3 { static public void main(String args[]) { // new Two(); Three t = new Three(); t.greet1(); t.greet2(); อ.รัชดาพร คณาวงษ์

Interfaces คือ abstract classes ที่มีสมาชิก Data member เป็น ค่าคงที่ Method member เป็น abstract อ.รัชดาพร คณาวงษ์

Interfaces ใช้คำว่า “interface” แทน “class” ทุก method ต้องเป็น abstract method และ public ทุก data members ต้องเป็น static และ final interface Greeting { static final public String s = “Hello”; abstract void greet(); } อ.รัชดาพร คณาวงษ์

Interfaces เนื่องจาก interface มีได้เพียง abstract method หรือค่าคงที่เท่านั้น ดังนั้นเราจะสร้างคลาสจาก interface ได้โดยใช้คำว่า interface แทนคำว่า extends ส่วนคำว่า extends จะส่งให้ interface เท่านั้น interface extends class extends interface implements class อ.รัชดาพร คณาวงษ์

Interface ตัวอย่างการสร้างคลาสจาก interface interface Greeting { static final String s = “Hello”; abstract void greet(); } class Hello implements Greeting { public void greet() { System.out.println(s); } class Interface1 { public static void main(String args[]) { new Hello().greet(); อ.รัชดาพร คณาวงษ์

Interface ตัวอย่างการสร้างคลาสจาก interface class Hi implements Greeting { public void greet() { System.out.println(s); } void moreGreet() {System.out.println(“How r u?”);} } class Interface2 { static void test(Greeting g) { g.greet();} public static void main(String args[]) { test(new Hello()); test(new Hi()); อ.รัชดาพร คณาวงษ์

Note:Interface Note: เราไม่สามารถสร้าง instance ของ interface ดังนั้น data members ต้องมีค่าเริ่มต้น และ ไม่มี constructor อย่างเด็ดขาด อ.รัชดาพร คณาวงษ์

Multiple Inheritance ในภาษา C++ ยอมให้มีการกำหนดคลาสที่สืบทอดจากคลาสแม่มากกว่า หนึ่งคลาส ซึ่ง เป็นกลไกที่มีประโยชน์อย่างมาก และสร้างปัญหาอย่างมากเช่นกัน ถ้าไม่ระมัดระวังในการใช้งาน ซึ่งเป็นเหตุให้ Java ไม่ยอมให้มีการทำ multiple inheritance อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem คลาส One และ คลาส Two มี int a เป็นสมาชิกทั้งคู่ และ คลาส Three สืบทอดจาก คลาส One และ Two ดังนั้นคำสั่ง cout << a ใน constructor ของ คลาส Three จะเป็น a ที่สืบทอดจากคลาส One หรือคลาส Two ? #include <iostream.h> class One { public: int a = 1; } class Two { public: int a = 2;} class Three : public One, public Two { public: Three() { cout<<a; } } อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem-Fix ปัญหาข้างต้นสามารถแก้ไขได้โดยวิธีใส่ Qualified เข้าไป ระบุว่ามาจากคลาส One หรือคลาส Two #include <iostream.h> class One { public: int a = 1; } class Two { public: int a = 2;} class Three : public One, public Two { public: Three() { cout<< One.a; } } อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem คลาส Zero มี int a เป็นสมาชิก แล้ว คลาส One และ คลาส Two สืบทอดมาจากคลาส Zero แต่กำหนดค่าให้ a ไม่เท่ากัน ดังนั้น ค่าa ควรจะมีค่าเป็นเท่าใด? #include <iostream.h> Class Zero { public: int a;} class One:public Zero { public: One() { a = 1; } class Two:public Zero { public: Two() { a = 2;} class Three : public One, public Two { public: Three() { cout << a; } } อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem-Fix จากตัวอย่างปัญหาข้างต้น Qualified ไม่ช่วยแก้ปัญหาซะแล้วเพราะค่า a จะเป็นเท่าใด ขึ้นกับการสืบทอด ภาษา C++ ก็พยายามแก้ไขปัญหานี้อีกโดยใช้ dynamic inheritance ขึ้น คือเพิ่ม keyword “virtual” เพื่อขยายในตอนรันโปรแกรม และเป็นตามลำดับดังนี้ class Three : public virtual One, public virtual Two { ... } อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem การแก้ปัญหาข้างต้น ทำได้แต่เพียงการมองเห็น data member เท่านั้น ซึ่งไม่อาจแก้ปัญหาการ polymorphism method ได้ อ.รัชดาพร คณาวงษ์

Multiple Inheritance:Problem #include <iostream.h> class One { public: virtual void print() { cout << “One”; } }; class Two { public: virtual void print() { cout << “Two”; } class Three : public One, public Two {}; void test (Three x) { x.print(); } void main() { Three t; Test(t); } อ.รัชดาพร คณาวงษ์

Multiple Inheritance&Interface จาวาจึงไม่ยอมให้ทำ multiple inheritance แต่อย่างไรก็ตาม multiple inheritance มีประโยชน์อย่างมาก ดังนั้น จาวาจึงใช้ interface เข้ามาช่วยแก้ปัญหานี้ ภาษาจาวายอมให้ extends ได้จากคลาสเดียว แต่ยอมให้ implements จาก interfaces ได้ไม่จำกัด อ.รัชดาพร คณาวงษ์

Multiple Inheritance&Interface interface Greeting { abstract void greet(); } interface Farewell { abstract void bye(); } class MyClass implements Greeting, Farewell { public void greet() { System.out.println(“Hello”);} public void bye() { System.out.println(“Goodbye”);} } class MulInterface { static void test1(Greeting g) { g.greet();} static void test2(Farewell f) { f.bye();} public static void main(String args[]) { MyClass s = new MyClass(); test1(s); test2(s); อ.รัชดาพร คณาวงษ์

Multiple Inheritance&Interface class Greeting{void greet() {System.out.println(“Hello”);}} interface Farewell { abstract void bye();} class MyClass extends Greeting implements Farewell { public void bye() { System.out.println(“Goodbye”);} } class MulInterface { static void test1(Greeting g) { g.greet();} static void test2(Farewell f) { f.bye();} public static void main(String args[]) { MyClass s = new MyClass(); test1(s); test2(s); อ.รัชดาพร คณาวงษ์

Partially implementation interface Greeting{ abstract void thai(); abstract void english(); } abstract class NotYetGreet implements Greeting { public void thai() { System.out.println(“Ohiyo”);} class Greet extends NoYetGreet { public void english() {System.out.println(“Good morning”);} class PartInterface { public static void main(String args[]) { Greet g = new Greet(); g.thai(); g.english(); อ.รัชดาพร คณาวงษ์

Interface extending interface Greeting { abstract void hi();} interface MoreGreeting extends Greeting { abstract void hello();} class Greet implements MoreGreeting { public void hi() {System.out.print(“Hi”);} public void hello() {System.out.print(“Hello”);} } class extInterface { public static void main(String args[]) { Greet g = new Greet(); g.hi(); g.hello(); อ.รัชดาพร คณาวงษ์

Interface without abstract method interface MyConstants { int YES = 1; double PI = 3.1415; String GREET = “Hello”; } class ConsInterface implements MyConstants { public static void main(String args[]){ System.out.println(YES); System.out.println(PI); System.out.println(GREET); อ.รัชดาพร คณาวงษ์

ทดสอบ interface A { int x = 1; } interface B { int x = 2; } class Test1Interface implements A, B{ public static void main(String args[]){ // System.out.println(x); System.out.println(A.x); System.out.println(B.x); } interface A { public void f(); } interface B { public void f(); } class Test2Interface implements A, B{ public void f() { System.out.println(“f”); } public static void main(String args[]){ new Test2().f(); } อ.รัชดาพร คณาวงษ์

ทดสอบ interface A { int x = 1; } interface B extends A { int x = 2; } class Test3Interface implements A, B{ public static void main(String args[]){ System.out.println(x); } interface A { public void f(); } interface B extends A { public void f(); } class Test4Interface implements A, B{ public void f() { System.out.println(“f”); } public static void main(String args[]){ new Test().f(); } อ.รัชดาพร คณาวงษ์

ตัวอย่าง สมมุติว่าเราเป็นผู้ผลิตซอฟต์แวร์ตัวหนึ่งชื่อ MyApplication ซึ่งต้องมีการติดตั้งโปรแกรม driver ของเครื่องพิมพ์ได้ด้วย โดยใช้ setPrinter() ดังนั้น เราจึงให้ driver ของเครื่องพิมพ์ ชื่อคลาส printer class MyApplication { Printer p; void setPrinter(Printer p) { this.p = p;} void printOut() { p.print();} } อ.รัชดาพร คณาวงษ์

driver printer class เราสร้าง คลาส driver printer แบบ ธรรมดา class Printer { protected int c = 0; public int getCount() { return c; } public void print() { c++; System.out.println(“Printer”); } อ.รัชดาพร คณาวงษ์

Sub classes สมมติมีบริษัท X และ Y ผลิต printer ซึ่งจะนำ class printer driver ของเราไปขยายได้ดังนี้ class Xprinter extends Printer { public void print() { c++; System.out.println(“X Printer”); } class Yprinter extends Printer { public void print() { c++; System.out.println(“Y Printer”); } อ.รัชดาพร คณาวงษ์

Polymophism ซึ่งเราก็สามารถเอา driver มาติดตั้งในโปรแกรมของเราได้โดยเขียนดังนี้ class MyApplicationTest { public static void main(String args[]) { MyApplication a = new MyApplication(); a.setPrinter(new Xprinter()); a.printOut(); } อ.รัชดาพร คณาวงษ์

driver printer abstract class หากไม่ใช่ผู้ผลิตเครื่องพิมพ์ การเขียน print() ไม่สามารถทำได้ เพราะไม่ทราบรายละเอียด ดังนั้นการทำเป็น abstract class น่าจะเป็นทางเลือกที่ดีกว่า abstract class Printer { protected int c = 0; public int getCount() { return c; } abstract public void print() } อ.รัชดาพร คณาวงษ์

driver printer Interface การเปิดเผยตัวโปรแกรม อาจจะไม่ใช่สิ่งที่ดีนักในทางธุรกิจ ดังนั้น ถ้าเราจะเพียงแต่ให้ specification design น่าจะดีกว่า interface Printer { int getCount() void print() } อ.รัชดาพร คณาวงษ์

driver printer Interface ทางบริษัทผู้ผลิตเครื่องพิมพ์ ก็สามารถสร้าง คลาสที่ขยายได้ดังนี้ class Xprinter implements Printer { private int c = 0; public int getCount() {return c;} public void print() { c++; System.out.println(“X Printer”); } class Xprinter implements Printer { private int lc = 0; public int getCount() {return (int)lc;} public void print() { c++; System.out.println(“Y Printer”); } อ.รัชดาพร คณาวงษ์