B
À
I 6
LẬP TRÌNH TỔNG QUÁT TRONG JAVA
GIẢNG VIÊN TRẦNTHỊ VÂN
GIẢNG
VIÊN
:
TRẦN
THỊ
VÂN
v1.0011107228
1
TÌNH HUỐNG DẪN NHẬP
Bài toán: Hệ thống quảnl
ý
các loại
v
ật nuôi tại
v
ườnthúHàNội
•VườnthúHàNộimuốnxâydựng mộthệ thống để quảnlývàgiớithiệucácconvật
nuôi
tại
đó
.
Các
loài
vật
nuôi
cần
quản
lý
như
:
hổ,
khỉ,
mèo,
chó,
sư
tử,
ngựa
v
.
v
.
,
nuôi
tại
đó
.
Các
loài
vật
nuôi
cần
quản
lý
như
:
hổ,
khỉ,
mèo,
chó,
sư
tử,
ngựa
v
.
v
.
,
các hoạt động liên quan đếntừng vật nuôi: ăn, phát âm v.v.
•Nếunhư nhóm tấtcả các loài trên thuộccùngnhómđộng vật (animal) có khả năng
ể
ănvàphátâmthìkhôngth
ể
hiện đượchết các hành động củatừng loài vậtnh
ư
:
chó là động vậtcóthểănthức ăntạpvàphátratiếng kêu gâu gâu, mèo là động
v
ậ
tcóth
ể
ănt
ạp
và
p
hát ra tiến
g
kêu meo meo
,
n
gự
alàđ
ộ
n
g
v
ậ
tcóth
ể
ăncỏ và
ậ
ạp
p
g
,
gự
ộ g
ậ
phát ra tiếngkêuhíhív.v Cũng không thể quảnlýchitiếtvề từng loài vậtvì
những loài vât này đềucónhững hành động chung là có thểăn, có thể phát âm,
nhưng
ăn
gì
và
phát
âm
gì
thì
tùy
vào
từng
loài
vật
nhưng
ăn
gì
và
phát
âm
gì
thì
tùy
vào
từng
loài
vật
.
Vậy
theo
Anh
Chị
để
quản
lý
các
loài
vật
nuôi
ta
nên
xây
dựng
những
đối
tượng
Vậy
theo
Anh
Chị
để
quản
lý
các
loài
vật
nuôi
ta
nên
xây
dựng
những
đối
tượng
động vậttronghệ thống thế nào?
v1.0011107228
2
MỤC TIÊU
Trình bày về tính trừutượng hóa, tính đahìnhtrongJava.
Xây dựng chương trình đơngiảnsử dụng lớptrừutượng, interface.
Phân tích mộtsố bài toán đơngiảntheohướng đốitượng sử dụng các
tính chấtvề tính kế thừa, trừutượng.
v1.0011107228
3
NỘI DUNG
Giớithiệuvề tính trừutượng trong lậptrìnhhướng đốitượng.
1
Lập
trình
trừu
tượng
trong
Java
2
Lập
trình
trừu
tượng
trong
Java
.
2
v1.0011107228
4
1. TÍNH TRỪU TƯỢNG TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Một đặctả trừutượng cho ta biếtmột đốitượng có thể làm gì mà không bậntâmvào
việcnólàmnhư thế nào?
Sư tử có thể thựchiệntất
cả các chứcnăng như:
Nhìn
ngửi
ăn
săn
mồi
Nhìn
,
ngửi
,
ăn
,
săn
mồi
…
mà không cầnbiếtnóthực
hiệnnhư thế nào.
v1.0011107228
5
2. LẬP TRÌNH TRỪU TƯỢNG TRONG JAVA
2.1. Lớptrừutượng.
2.2. Interface – Giao diện.
v1.0011107228
6
2.1. LỚP TRỪU TƯỢNG
•Khimớigiớithiệukháiniệm đốitượng, ta nói rằng chúng có thểđượcnhómlại
thành các lớp, trong đómỗilớplàmộttậpcácđốitượng có cùng thuộctínhvà
hành
vi
hành
vi
.
•Tacũng nói theo chiềungượclạirằng ta có thểđịnh nghĩamột đốitượng như
làm
ộ
tth
ể
hi
ệ
ncủam
ộ
tlớ
p
.
ộ
ệ
ộ
p
•Nghĩalà:Lớpcóthể tạo đốitượng.
•Hầuhếtcáclớptađãgặp đềutạo đượcthể hiện. Ta có thể tạothể hiệncủalớp
Student hay Employee.
v1.0011107228
7
ể
ể
2.1. LỚP TRỪU TƯỢNG (tiếptheo)
•
T
uy nhiên, vớimộtsố lớp, có th
ể
không hợp lý khi nghĩđến chuyệntạoth
ể
hiện
củacáclớp đó.
•
Ví
dụ
:
Trong
hệ
thống
quản
lý
loài
vật
nuôi
:
Horse,
Dog,
Cat
là
các
lớp
đối
tượng
.
Ví
dụ
:
Trong
hệ
thống
quản
lý
loài
vật
nuôi
:
Horse,
Dog,
Cat
là
các
lớp
đối
tượng
.
Vậymột đốitượng animal (động vật) chính xác là cái gì? Phương thức
pronunciation() sẽđưaracáigìkhikhôngbiết đó là horse, dog hay cat.
Ta có thể nói rằng một đốitượng chó là mộtthể hiệncủa động vật, nhưng
thực ra không phải, nó là mộtthể hiệncủalớpdẫnxuấtcủa động vật.
<<abstract>>
Animal
Horse Dog Cat
v1.0011107228
8
2.1. LỚP TRỪU TƯỢNG (tiếp theo)
•
Lớp
trừu
tượng
(Abstract
Base
Class
–
ABC)
là
một
lớp
không
thể
tạo
thể
hiện
•
Lớp
trừu
tượng
(Abstract
Base
Class
ABC)
là
một
lớp
không
thể
tạo
thể
hiện
.
•Thựctế,tathường phân nhóm các đốitượng theo kiểunày:
Chó và mèo đềulàđộng vật, nhưng mộtconđộng vậtlàcongì?
Hay bia và rượu đềulàđồ uống, nhưng mộtthứđồuống chính xác là cái gì?
•Cóthể xác định xem mộtlớpcóphảilàlớptrừutượng hay không khi ta không thể
ì
đ
ộ
hể
hiệ
ủ
lớ
à
àl i
khô
hải
là
hể
hiệ
ủ
ộ
lớ
t
ì
m
đ
ượcm
ộ
tt
hể
hiệ
nc
ủ
a
lớ
pn
à
ym
àl
ạ
i
khô
ng p
hải
là
t
hể
hiệ
nc
ủ
am
ộ
t
lớ
pcon
Có con động vậtnàokhôngthuộcmộtnhómnhỏ hơnkhông?
C
ó
đồ
uống
nào
không
thuộc
một
loại
cụ
thể
hơn
không?
C
ó
đồ
uống
nào
không
thuộc
một
loại
cụ
thể
hơn
không?
•Lớptrừutượng chứacácphương thứctrừutượng. Cách thứcmôtả lớpvàphương
thứctrừutượng:
public abstract class ClassName {
}
<<abstract>>
}
public abstract class ClassName {
<<abstract>>
ClassName
v1.0011107228
9
public abstract <returntype> methodName(<params>);
}
GIẢI QUYẾT BÀI TẬP TÌNH HUỐNG
Giả
sử
lớp
animal
là
lớp
trừu
<<abstract>>
Giả
sử
lớp
animal
là
lớp
trừu
tượng, nó có các lợiíchgì?
<<abstract>>
Animal
Mọithuộctínhvàhànhvi
củalớpcơ sở (Animal) có
mặt
trong
mỗi
thể
hiện
của
Horse CatDog
Sơ đồ quan hệ giữa các lớp trong bài tập tình huống
mặt
trong
mỗi
thể
hiện
của
các lớpdẫnxuất(Horse,
Dog, Cat).
/**
* Animal.java
*/
p
ublic abstract
c
lass
A
nimal
{
protected String name;
//Constructor for objects of class Animal
p
ublic Animal
(){
}
p
(){
}
public Animal(String _name){ this.name = _name; }
//Abstract methods
protected abstract String pronunciation();
protected
abstract
String
action()
;
v1.0011107228
10
protected
abstract
String
action()
;
protected abstract void eat();
protected String getName() {return this.name;}
}
/**
* Cat.java
/**
* Dog
.
j
ava
*/
public class Cat{
//Constructor for objects of class Cat
public
Cat(){
}
*/
public class Dog {
//Constructor for objects of class Dog
bli
D (){
}
public
Cat(){
}
public Cat(String _name){ super(_name); }
//overriden methods
p
ublic Strin
g
p
ronunciation()
{
r
eturn
"
meo
m
eo"
;
}
p
u
bli
c
D
og
(){
}
public Dog(String _name){ super(_name); }
//overriden methods
public
String
pronunciation()
{
return
"gau
gau
"
;
}
p
g
p
public String action() { return "bat chuot"; }
public void eat() { System.out.println("An chuot");}
}
public
String
pronunciation()
{
return
gau
gau
;
}
public String action() { return "trong nha"; }
public void eat() { System.out.println("Gam xuong");}
}
/**
* Horse.java
*
/
/
public class Horse{
//Constructor for objects of class Horse
public Horse(){ }
public
Horse(String
name){
super( name)
;
}
public
Horse(String
_name){
super(
_
name)
;
}
//overriden methods
public String pronunciation() { return "hi hi"; }
public String action() { return "chay dua"; }
i
i
i
v1.0011107228
11
publ
i
cvo
i
d eat()
{
S
ystem
.
o
ut
.
p
r
i
ntln("An
c
o")
;
}
}
/**
* Client.java
*/
bli
l
Cli t
pu
bli
c
cl
ass
Cli
en
t
{
public static void main(String[] args) {
Animal dog = new Dog();
Ai l
t
C t()
A
n
i
ma
l
ca
t
= new
C
a
t()
;
Animal horse = new Horse();
System.out.println("Dog pronunciation: " + dog.pronunciation());
System.out.println("Dog eat:"); dog.eat();
St
t
itl("Ct
iti
"
t
iti ())
S
ys
t
em
.
ou
t
.pr
i
n
tl
n
("C
a
t
p
ronunc
i
a
ti
on:
"
+
c
a
t
.
p
ronunc
i
a
ti
on
())
;
System.out.println("Cat eat:"); cat.eat();
System.out.println("Horse pronunciation:" + horse.pronunciation());
System.out.println("Horse eat:"); horse.eat();
}
}
}
v1.0011107228
12
CÁC ĐẶC ĐIỂM CỦA LỚP TRỪU TƯỢNG
• Không thể tạomột đốitượng trựctiếptừ lớptrừutượng.
•Lớptrừutượng có thể chứacácthuộctínhvàphương thứcnhư các lớp
thông thường.
•
Một
lớp
phải
được
khai
báo
là
lớp
trừu
tượng
nếu
chứa
các
phương
thức
trừu
•
Một
lớp
phải
được
khai
báo
là
lớp
trừu
tượng
nếu
chứa
các
phương
thức
trừu
tượng.
•Lớptrừutượng cần đượckế thừavàcàiđặtchitiếtcácphương thứctrừu
tượng ở các lớpcon.
•Lớptrừutượng tạorakhả năng lậptrìnhvớicácđốitượng khi chỉ biếtcác
mô
tả
trừu
tượng
về
nó
mà
chưa
có
cài
đặt
chi
tiết
mô
tả
trừu
tượng
về
nó
mà
chưa
có
cài
đặt
chi
tiết
.
v1.0011107228
13
CÂU HỎI TƯƠNG TÁC
Hãy
nêu
sự
khác
nhau
giữa
phương
thức
trừu
tượng
và
phương
thức
Hãy
nêu
sự
khác
nhau
giữa
phương
thức
trừu
tượng
và
phương
thức
thông thường?
v1.0011107228
14
BÀI TẬP
Chương trình sử dụng đối tượng đồ họa (graphic) để vẽ các đối tượng hình học cơ bản
(h )
(
s
h
ape
)
v1.0011107228
15
Đáp án tham khảo
2.1. TỪ KHOÁ FINAL
Từ khoá final đượcsử dụng cho lớp và các thành phầncủalớp.
•Khisử dụng cho khai báo lớpthìlớp đósẽ không có khả năng đượckế thừa
ậ
ớ
à
ẽ
ô
ả
à
ớ
(Do v
ậ
yl
ớ
pn
à
ys
ẽ
kh
ô
ng ph
ả
il
à
l
ớ
p abstract);
public final class ClassN{}
•
Khi
sử
dụng
cho
khai
báo
hằng
số
:
•
Khi
sử
dụng
cho
khai
báo
hằng
số
:
public static final double PI=3.1415;
•Khis
ử
d
ụ
n
g
cho khai báo
p
hươn
g
thứcthì
p
hươn
g
thức đósẽ khôn
g
đư
ợ
c
ụ g
p g
p g
g
ợ
overriden (ghi đè) lạitronglớpkế thừa.
final void eat(){}
v1.0011107228
16
PROPERTIES
On passing
'
Finish
'
button:
Goes to Next Slide
On
passing
,
Finish
button:
Goes
to
Next
Slide
On failing, 'Finish' button: Goes to Next Slide
Allow user to leave quiz: At any time
User may view slides after quiz: At any time
User may attempt quiz: Unlimited times
2.2. INTERFACE
Trong casestudy của Session 02 sự tương tác giữahaiđốitượng: công tắcvàbóngđèn:
•Nhược điểmcủa ứng dụng này là sự liên kếtgiữa SwitchButton và ElectricLamp khá
chặt. Như vậymỗi switchbutton đượctạorachỉ có thểđiềukhiểnbậtvàtắt được
mộtloại đốitượng là ElectricLamp. Tuy nhiên trên thựctế,córấtnhiềuloại đối
tượng cũng có khả năng bậttắt đượcvídụ như quạt điện (ElectricFan), hay đài
(
Radio
),
khi đókhả năn
g
tái s
ử
d
ụ
n
g
của SwitchButton cho các thiếtb
ị
mớinà
y
là
(),
g
ụ g
ị
y
không thể.
•Ngônngữ Java đưaramộtgiảiphápchovấn đề này đólàkháiniệmvề Interface.
Interface
giúp
cho
người
phân
tích
thiết
kế
có
thể
phân
loại
một
nhóm
các
đối
tượng
Interface
giúp
cho
người
phân
tích
thiết
kế
có
thể
phân
loại
một
nhóm
các
đối
tượng
thuộccáclớp khác nhau dựa trên các hành vi tương tự nhau.
•Như trong ví dụ trên ta có ElectricLamp, ElectricFan, Radio v.v là các nhóm đối
tượng
đề
có
khả
năng
bật
à
tắt
(S itchable)
do
ậ
tong
thiết
kế
ta
có
thể
tạo
a
tượng
đề
u
có
khả
năng
bật
v
à
tắt
(S
w
itchable)
,
do
v
ậ
y
t
r
ong
thiết
kế
ta
có
thể
tạo
r
a
mộtInterfacelấy tên là Switchable vớicáctínhnăng đượcmôtả trước(bậtvàtắt).
Khi đó đốitượng SwitchButton chỉ cầnkếtnốitớimộtSwitchablelàcóthểđiều
khiể
đượ
đối
tượ
à
à
d
ậ
SithBtt
lú
à
ó
thể
đượ
ử
d
để
v1.0011107228
18
khiể
n
đượ
c
đối
tượ
ng n
à
y, v
à
d
ov
ậ
y
S
w
it
c
hB
u
tt
on
lú
cn
à
yc
ó
thể
đượ
cs
ử
d
ụng
để
điềukhiểnrấtnhiềucácloạithiếtbị Switchable khác nhau như ElectricLamp, Radio,
ElectricFan v.v…
2.2. INTERFACE (tiếptheo)
•KháiniệmIntefacegiúptạoracácquytắcbaogồmcácmôtả trừutượng về khả
năng củamột đốitượng để từđólàmcơ sở phân nhóm các lớpkhácnhaudựatrên
khả
năng
của
chúng
khả
năng
của
chúng
.
•Interfacegầngiống như mộtlớptrừutượng, tuy nhiên nó chỉ chứacácphương thức
trừutượng và các hằng số thuộclớp.
• Cách khai báo:
public interface InterfaceName {
}
public interface InterfaceName {
public <returntype> methodName1(<params>);
public <returntype> methodName2(<params>);
public
<returntype>
methodName2(<params>);
}
v1.0011107228
19
CÁC ĐẶC ĐIỂM CƠ BẢN
•
Interface
không
cho
phép
tạo
ra
các
thể
hiện
trực
tiếp
.
Interface
không
cho
phép
tạo
ra
các
thể
hiện
trực
tiếp
.
•Intefacecóthểđượckế thừa để tạoramộtinterfacemới.
•Mộtlớp không thể kế thừatừ mộtinterface.
ộ
ớ
é
ộ
ặ
ề
ô
ế
à
ặ
•M
ộ
tl
ớ
p đượcph
é
pmangm
ộ
tho
ặ
c nhi
ề
uinterfaceth
ô
ng qua cơ ch
ế
c
à
i đ
ặ
t
interface.
•Khimộtlớpmangmột interface nào thì các đốitượng thuộclớp đó đượccoinhư
là th
ể
hiệncủainterfaceđó.
•Interfacethường đượcnhắc đếnnhư là cách thứcnhằmbùlạihạnchế không hỗ
tr
ợ
đak
ế
thừatron
g
Java.
ợ
g
•Interfacegiúpmôtả mốiquanhệ “có tính năng” giữacácđốitượng: Ví dụ:Quạt
điện“có khả năng bậttắt”, Radio “có khả năng bậttắt” v.v Khi đócóthể nói quạt
điện
và
radio
là
những
đối
tượng
“Có
khả
năng
bật
tắt
”
điện
và
radio
là
những
đối
tượng
Có
khả
năng
bật
tắt
.
•Cáchsử dụng và cài đặtinterface:
Mộtlớpbấtkỳ có thể mang (cài đặt) mộthoặcnhiều interface khác nhau
bằ
áh
ử
d
từ
kh á
il t
th
là
dh
áh
á
it f
bằ
ng c
á
c
h
s
ử
d
ụng
từ
kh
o
á
i
mp
l
emen
t
s
th
eo sau
là
d
an
h
s
á
c
h
c
á
c
i
n
t
er
f
ace.
Mộtlớpkhicàiđặtinterfacesẽ tiến hành cài đặtchitiếtcácphương thức đã
mô tả trong các interface đónếukhôngphảithaythế phương thức không cài
ằ
ộ
ứ
ừ
v1.0011107228
20
đặtb
ằ
ng m
ộ
tphương th
ứ
ctr
ừ
utượng.
VÍ DỤ
Cách cài đ
ặ
tvàs
ử
d
ụ
n
g
interface.
ặ
ụ g
v1.0011107228
21
/**
* Write a description of interface Switchable here.
*
*
@author
(your
name)
*
@author
(your
name)
* @version (a version number or a date)
*/
public interface Switchable
{
{
void switchOn();
void switchOff();
}
/**
/**
* Write a description of class SwitchButton here.
* @author (your name)
* @version (a version number or a date)
*/
*/
public class SwitchButton{
private Switchable switchObj;
/**
*
Constructor
for
objects
of
class
SwitchButton
Constructor
for
objects
of
class
SwitchButton
*/
public SwitchButton() { }
public void connectTo(Switchable switchObj) {
t
his.switchObj=switchObj
;
}
public void switchOn() {
switchObj.switchOn();
}
v1.0011107228
22
public
v
oid switchOff()
{
switchObj.switchOff();
}
}
/**
* Write a description of class ElectricLamp here.
*
* @author (your name)
* @version (a version number or a date)
*/
p
ublic
c
lass ElectricLam
p
i
m
p
lements
S
witchable
p
p
p
{
/**
* Fields
*/
/
private String status;
/**
* Constructor for objects of class ElectricLamp
*/
*/
public ElectricLamp()
{
// To do:
status="Dark!";
}
public void switchOn() {
status="Li
g
ht!"
;
g
System.out.println(status);
}
public void switchOff() {
status=
"
Dark!
"
;
v1.0011107228
23
status= Dark!
;
System.out.println(status);
}
}
/**
* Write a description of class Radio here.
*
*
@author
(your
name)
@author
(your
name)
* @version (a version number or a date)
*/
public class Radio implements Switchable
{
{
/**
* Fields
*/
private
String
status
;
private
String
status
;
/**
* Constructor for objects of class Radio
*/
public
Radio()
public
Radio()
{
// To do:
status=" ";
}
}
public void switchOn() {
status="^&%&^%^$^%@!)(^#!";
System.out.println(status);
}
}
public void switchOff() {
status=" ";
System.out.println(status);
}
v1.0011107228
24
}
}
Đáp án bài tập tham khảo
CÂU HỎI TƯƠNG TÁC
Sự khác biệtgiữalớptrừutượng và Interface?
Sự
khác
biệt
giữa
lớp
trừu
tượng
và
Interface?
v1.0011107228
25