Upload
letuong
View
218
Download
1
Embed Size (px)
Citation preview
Chapter9-part3Absrtract Class vs. Interface
หมายถึง 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
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(){}
}
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();
}
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."); }
}
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
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
เป็น 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
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();
}
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 สามารถเรียกใชไ้ดเ้ลยและค่าจะเปล่ียนไปเม่ือถูกเรียกใชง้าน
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 ก่อน
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 มีค่าเพ่ิมข้ึน
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() ใหม่ทุกคร้ังในลูป
interface class
final ?เป็น modifier ชนิดหน่ึง
นาํหนา้ class และ method ได้
นาํหนา้ primitive data type (int double float String …)
สามารถนาํ static มาไวห้นา้ final ได้
เม่ือมีการประกาศ final แลว้ตอ้งมีการกาํหนดค่าลงไปในกรณี variable
ค่าของ final variable จะไม่สามารถเปล่ียนแปลงได้
และค่าของ final method จะไม่สามารถ override method ได้
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
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
Interface class ตวัอยา่ง 2.3multiple implement
Person Faculty Club
Students Teachers
subStudent subTeacher2 subTeacher1
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{ }
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;
}}
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;
}}
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
interface class
ผลลพัธ์ทีไ่ด้จากตัวอย่าง 2.3
Bandit,55021111,University of Phayao,Badminton Club
Nattapon,University of Phayao
Wattanapong,University of Phayao
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
abstract class vs interface class abstract class
class ตน้แบบ เพื่อให ้class อ่ืนสืบทอด เช่น
class Teacher ถูกสร้างเพื่อเป็นแม่แบบ สาํหรับ
object อ่ืนๆ ท่ีเป็นครู
interface class
class ลูกท่ีสืบทอด เลือกท่ีจะสืบทอดหลายๆ
คุณสมบติัจากคลาสตน้แบบ เช่น student สืบทอด
คุณสมบติั university, club, library, course เป็นตน้
Exercise
คิดโครงสร้างของระบบท่ีมีการใชง้าน interface class
เขียนโปรแกรมแสดงผลการใชง้าน