25
Chapter9-part3 Absrtract Class vs. Interface

Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

  • Upload
    letuong

  • View
    218

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Chapter9-part3Absrtract Class vs. Interface

Page 2: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

หมายถึง class ท่ีไม่สามารถสร้าง instance ได(้สร้าง instance class แบบปกติ)

คุณสมบติั abstract class 1. มีคาํวา่ abstract อยูห่นา้ class นั้น

2. method ภายใน abstract class มีหรือไม่มีคาํวา่ abstract อยูห่นา้ช่ือ method นั้นก็ได้

• ถา้ไม่มี abstract นาํหนา้ช่ือ method ใหเ้ขียน method ตามปกติ

• ถา้มี abstract นาํหนา้ช่ือ method หมายถึง method นั้นจะยงัไม่สมบูรณ์ ตอ้งถูก override method

3. การเรียกใชง้าน abstract class ทาํได ้2 วิธีคือ

• new instance และทาํการ override ทุกๆ method ท่ีเป็น abstract method• สืบทอดคุณสมบติั(extends class) โดยแบ่งเป็นสองแบบ

o ถา้ class ท่ีมาสืบทอดถูกประกาศเป็น abstract class ไม่จาํเป็นตอ้ง override method เลยกไ็ด้

o ถา้ class ท่ีมาสืบทอดเป็น class ทัว่ไป ตอ้งสร้าง abstract method ใหเ้ป็น method ท่ีสมบูรณ์ ทั้งหมด

4. การ extends(inherit) สืบทอดไดที้ละ 1 class เท่านั้น

Abstract class

Page 3: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Abstract class

public abstract class Abstract {}

ตวัอยา่ง abstract class ในรปูแบบต่างๆabstract class Abstract {

void printTxt(){System.out.println("This is text.");

}}

abstract class Abstract {abstract void printTxt(){System.out.println("This is text.");

}}

abstract class Abstract {}

abstract class Abstract {abstract void printTxt();

}

abstract class Abstract {void printTxt(){}

}

Page 4: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Abstract class

ตวัอยา่ง abstract class ในรปูแบบต่างๆ

abstract class Abstract {abstract void printTxt();

}

abstract class Abstract {void printTxt(){

System.out.println("This is text."); }abstract void greeting();

}

abstract class Abstract {abstract int printTxt();

}

abstract class Abstract {abstract void printTxt();abstract void greeting();

}

Page 5: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Abstract class

ตวัอยา่ง abstract class ในรปูแบบต่างๆ

abstract class Abstract {void printTxt(){

System.out.println("This is text."); }void greeting() {

System.out.println(“Hello"); }

} class Abstract {void printTxt(){

System.out.println("This is text."); }

abstract void greeting();}

class Abstract {void printTxt(){

System.out.println("This is text."); }

}

Page 6: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

public class MainAbstract {public static void main(String[] args) {

Abstract2 a = new Abstract2();

a.greet();

//a.printTxt();

}

}

class Abstract2 extends Abstract{

void greet(){

System.out.println("Hello");

}

}

Abstract class

MainAbstract.java

ตวัอยา่ง 1.1

abstract class Abstract {void printTxt() {

System.out.println("This is text.");

}

abstract void greet();}

Abstract.java

Hello

//สรา้ง instance class Abtract โดยตรงไมไ่ด้

//extend class Abtract เป็น Abstract2

Page 7: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

public class MainAbstract {public static void main(String[] args) {

Abstract a = new Abstract() {

void greet(){

System.out.println("Hello");}

}

a.greet();}

}

Abstract class

MainAbstract.java

ตวัอยา่ง 1.2new instance

abstract class Abstract {void printTxt() {

System.out.println("This is text.");

}

abstract void greet();}

Abstract.java

Hello

//สรา้ง instance class Abtract แลว้ override method

แลว้แบบไหนดกีวา่กนั ?ตวัอยา่ง 1.1 กบั 1.2

Page 8: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

เป็น class ท่ีมีคุณสมบติัคลา้ย abstract class คือ

1. เป็นการสืบทอดคุณสมบติัของ class เหมือนกนั

2. มี abstract method เหมือนกนั(ใชค้าํวา่ abstract หนา้ช่ือ method)

โดยมีรูปแบบท่ีแตกต่างคือ

1. ใชค้าํวา่ interface นาํหนา้ class แทน abstract class

2. ตวัแปรท่ีสร้าง(attribute) ทั้งหมดเป็นประเภท static final อตัโนมติั

3. method ทั้งหมดเป็น public abstract อตัโนมติั

4. การสืบทอดคุณสมบติัจาก class แม่เปล่ียนจาก extends เป็น implements

โดย interface class จะตอ้งถูก implements method ทั้งหมด จึงจะสามารถสร้าง instance ได้

Interface class

Page 9: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class

interface ExIm1 {}

ตวัอยา่ง interface class ในรปูแบบต่างๆ

public interface ExIm1 {}

interface ExIm1 {void printTxt();

}

interface ExIm1 {int myVar = 1;

}

interface ExIm1 {int myVar = 1;void printTxt();

}

interface ExIm1 {void printTxt(){}

}

interface ExIm1 {int myVar;

}

interface ExIm1 {abstract void printTxt();

}

interface ExIm1 {static final int myVar = 1;

} interface ExIm1 {void printTxt(){}void greeting();

}

Page 10: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class

static ? เป็น modifier

ถูกนาํไวห้ลงั modifier ท่ีควบคุม visibility(public protected default private)

นาํหนา้ class ไดแ้ต่ตอ้งเป็น nested class(class ท่ีอยูภ่ายใต้ class ) (ดูตวัอยา่งสไลดต่์อไป)

นาํหนา้ method และ variable ได้

ไม่สามารถนาํหนา้ abstract method ได้

เม่ือมีการใชใ้น class จะสามารถเรียกใชไ้ด ้โดยตรง (ดูตวัอยา่งสไลดต่์อไป)

เม่ือมีการใชใ้น method จะสามารถเรียก class.method ไดโ้ดยตรง

เม่ือมีการใชใ้น variable จะสามารถเรียก class.method ไดโ้ดยตรง

ภายใน class ท่ีมีการใช ้static variable สามารถเรียกใชไ้ดเ้ลยและค่าจะเปล่ียนไปเม่ือถูกเรียกใชง้าน

Page 11: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class

nested class

class OuterClass{public static class StaticNestedClass{

}

public class InnerClass{}

}

class OtherClass{//Use of a static nested class:private OuterClass.StaticNestedClass staticNestedClass =

new OuterClass.StaticNestedClass();

//Doesn't workprivate OuterClass.InnerClass innerClass = new

OuterClass.InnerClass();

//Use of an inner class:private OuterClass outerclass= new OuterClass();private OuterClass.InnerClass innerClass2 =

outerclass.getAnInnerClass();private OuterClass.InnerClass innerClass3 = outerclass.new

InnerClass();}

จะเห็นวา่ OtherClass สามารถ เรียกใช ้

StaticNestedClass ผา่น OuterClass ไดโ้ดยตรง

ในขณะท่ี OtherClass ไม่สามารถ เรียกใช ้

InnerClass ผา่น OuterClass ไดโ้ดยตรง

โดย ตอ้งทาํการสร้าง instance ของ OuterClass ก่อน

Page 12: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class

static method

class Ex1 {public static void main(String[] args) {

System.out.println(nestedEx1.i);nestedEx1.i +=5;nestedEx1.getI();nestedEx1.getData();new nestedEx1().getData();System.out.println(nestedEx1.i);

}

}

class nestedEx1{static int i = 5;public static void getI(){

System.out.println(i+1);}

public void getData(){System.out.println(i++);

}

}

ผลลพัธ์ท่ีได้

5

11

10

11

จะสังเกตุเห็นวา่ i มีค่าเพ่ิมข้ึน

Page 13: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class static variable

class Ex2 {static int i = 1;int j = 1;public static void main(String[] args) {

for (int k = 0; k <5 ; k++) {incre1();new Ex2().incre2();}

}

public static void incre1(){System.out.println("i = "+ ++i +",");System.out.print("j = "+ ++j +",");

}

public void incre2(){System.out.print("i = "+ ++i +",");System.out.println("j = "+ ++j +",");

}

}

ผลลพัธ์ท่ีได้

i = 2,i = 3,j = 2,i = 4,i = 5,j = 2,i = 6,i = 7,j = 2,i = 8,i = 9,j = 2,i = 10,i = 11,j = 2,สงัเกตุเห็นค่า i กบั jจะเห็นวา่ค่า i เป็น static จะเพิ่มข้ึนทุกคร้ัง

แต่ j ไม่ถูกเพิ่ม

เน่ืองจากมีการ new Ex2() ใหม่ทุกคร้ังในลูป

Page 14: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class

final ?เป็น modifier ชนิดหน่ึง

นาํหนา้ class และ method ได้

นาํหนา้ primitive data type (int double float String …)

สามารถนาํ static มาไวห้นา้ final ได้

เม่ือมีการประกาศ final แลว้ตอ้งมีการกาํหนดค่าลงไปในกรณี variable

ค่าของ final variable จะไม่สามารถเปล่ียนแปลงได้

และค่าของ final method จะไม่สามารถ override method ได้

Page 15: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

public class MainInterface {public static void main(String[] args) {

Interface2 a = new Interface2();

a.greet();

}

}

class Interface2 implements Interface{

public void greet(){

System.out.println(txt);

}

}

Interface classMainInterface.java

ตวัอยา่ง 2.1

Interface class Interface {String txt = “Hello”;void greet();

}

Interface.java

Hello

//สรา้ง instance class Interface โดยตรงไมไ่ด้

//Implement class Interface เป็น Interface2

Page 16: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

public class MainInterface {public static void main(String[] args) {

Interface2 a = new Interface2();

a.greet();

}

}

class Interface2 implements Interface{

public void greet(){

System.out.println(txt);

}

}

Interface classMainInterface.java

ตวัอยา่ง 2.2

Interface class Interface {static final String txt = “Hello”;abstract void greet();

}

Interface.java

Hello

//สรา้ง instance class Interface โดยตรงไมไ่ด้

//Implement class Interface เป็น Interface2

Page 17: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class ตวัอยา่ง 2.3multiple implement

Person Faculty Club

Students Teachers

subStudent subTeacher2 subTeacher1

Page 18: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class ตวัอยา่ง 2.3multiple implement

public interface Person {void setName(String n);String getName();

}

public interface Faculty {String university = "University of Phayao";String getFaculty();

}

public interface Club {void setClub(String c);String getClub();

}

public interface Students extends Faculty, Person,Club {void setID(int id);int getID();

}

public interface Teachers extends Faculty, Person{ }

Page 19: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class ตวัอยา่ง 2.3multiple implement

public class subStudent implements Students {String name,club;int id;

public String getFaculty() {return university;

}

public void setName(String n) {name = n;

}

public String getName() {return name;

}

public void setClub(String n) {club = n;

}

public String getClub() {return club

}

public void setID(int id) {this.id = id;

}

public int getID(){return id;

}}

Page 20: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class ตวัอยา่ง 2.3multiple implement

public class subTeacher1 implements Faculty,Person {

String name,club;

public void setName(String n) {name = n;

}

public String getName() {return name;

}

public String getFaculty() {return university;

}}

public class subTeacher2 implements Teachers {String name,club;

public void setName(String n) {name = n;

}

public String getName() {return name;

}

public String getFaculty() {return university;

}}

Page 21: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Interface class ตวัอยา่ง 2.3multiple implement

public class MultiInterface {public static void main(String[] args) {

Students s1 = new subStudent();s1.setName("Bandit");s1.setID(55021111);s1.setClub("Badminton Club");System.out.println(s1.getName()+","+s1.getID()+","+s1.getFaculty()+","+s1.getClub());

subTeacher1 t1 = new subTeacher1();t1.setName("Nattapon");System.out.println(t1.getName()+","+t1.getFaculty());

Teachers t2 = new subTeacher2();t2.setName("Wattanapong");System.out.println(t2.getName()+","+t2.getFaculty());

}}

subStudent สืบทอด(inherit) Students

subTeacher สืบทอด(inherit) subTeachers

Teachers ไม่ได้สืบทอด(non-inherit) subTeachers

Page 22: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

interface class

ผลลพัธ์ทีไ่ด้จากตัวอย่าง 2.3

Bandit,55021111,University of Phayao,Badminton Club

Nattapon,University of Phayao

Wattanapong,University of Phayao

Page 23: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

abstract class vs interface class

Comparing abstract class interface class

class name declaration class ClassName interface ClassName

inherit extends implements

multiple inherit no yes

abstract method optional all methods

variable - static final

Page 24: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

abstract class vs interface class abstract class

class ตน้แบบ เพื่อให ้class อ่ืนสืบทอด เช่น

class Teacher ถูกสร้างเพื่อเป็นแม่แบบ สาํหรับ

object อ่ืนๆ ท่ีเป็นครู

interface class

class ลูกท่ีสืบทอด เลือกท่ีจะสืบทอดหลายๆ

คุณสมบติัจากคลาสตน้แบบ เช่น student สืบทอด

คุณสมบติั university, club, library, course เป็นตน้

Page 25: Chapter9-part3pirun.ku.ac.th/~faastwc/Java/pttx/chapter9-part-3-abstract-vs... · MainInterface.java

Exercise

คิดโครงสร้างของระบบท่ีมีการใชง้าน interface class

เขียนโปรแกรมแสดงผลการใชง้าน