L P TRÌNH JAVA C B N L P TRÌNH JAVA C B N
Ơ Ả Ơ Ả
Ậ Ậ
Ch
ng 8
ươ TH A K , ĐA HÌNH Ừ Ế VÀ PH M VI Ạ
Lê Tân B môn: L p trình máy tính
ậ
ộ
N i dung ch
ng 8
ộ
ươ
i ph
ươ
ng th c ứ
ả
ớ
Th a k ế ừ Bi n this và quá t ế Tính đa hình L p Object Cú pháp l p g c ố ớ Ph m vi truy c p ậ Th c hi n m t l p g c ố ộ ớ ệ Ph
ng th c t o sao chép
ạ ự ươ
ứ ạ
2/30
8.1 8.1 Th a k ế ừ
các l p đã t n t ể
t c nh ng vùng d li u và i. ồ ạ ữ ệ ớ ữ ớ ừ ế ấ ả
Phát tri n nh ng l p m i t L p con có th th a k t ứ khóa
ươ
ỉ ớ
c phát tri n t ừ ụ ớ ể ừ
ữ ậ ớ
Khai báo d li u và ph
ng th c c a C2
ữ ệ
ươ
ứ
ủ
} C2 đ
ớ ữ ớ ể ừ ph ng th c c a l p cha. ủ ớ Dùng t extends đ ch l p con. ể Ví d : l p C2 (l p các hình vuông) đ ượ ớ l p C1 (l p các hình ch nh t) ớ class C2 extends C1{
c g i là l p con (subclass, extended class, ọ ớ
C1 đ class)
3/30
c g i là l p cha (superclass, parent class, base ượ derived class) ượ ọ ớ
8.1 8.1 Th a k ế ừ
superclass các tr ừ ườ ng d li u và ữ ệ
ph ươ
Subclass th a k t ế ừ ng th c có th truy c p đ ể ể
ứ Có th thêm vào các tr ng th c ườ c ượ ậ ng d li u và ph ữ ệ ươ ứ
m i.ớ Th c t ự ế ở ộ c m r ng đ ch a nhi u ể ứ ề
Ví d l p Cylinder th a k t
, subclass th ế ng đ ườ ề
4/30
thông tin chi ti ụ ớ ượ t và nhi u ch c năng h n ơ ứ l p Circle: ế ừ ớ ừ
i ph
ế
ả
ươ
ng th c ứ
8.2 8.2 Bi n this và quá t
t c các l p, đ
c s d ng trong khi ch y
ộ
ượ ử ụ
ạ
Là m t bi n n t n t ế ẩ ồ ạ ớ và tham kh o đ n b n thân l p ch a nó. ả ế
i trong t ấ ả ớ
ứ
ả
Ví d :ụ
ề ố ề ố
ề ố
this.field_1 = par_1; this.field_2 = par_2;
}
ể
ề ố // …
}
ể
ề ố this.method_1() // …
}
}
5/30
i ph
ế
ả
ươ
ng th c ứ
8.2 8.2 Bi n this và quá t
Vi c khai báo trong m t l p nhi u ph
ệ
ề
ươ ể
ư ố ng tham s ) g i là khai báo quá t
ng th c có ứ ữ ệ i ả
ng th c (overloading method).
ố ượ ứ
ộ ớ cùng tên nh ng khác tham s (khác ki u d li u, khác s l ố ọ ph ươ Ví d :ụ
public class Xemay { // khai báo fields … public float tinhgiaban(){ return 2 * chiphisx;
} public float tinhgiaban(float huehong){ return (2 * chiphisx + huehong);
}
}
6/30
8.3 8.3 Tính đa hình
Kh năng c a ngôn ng cho phép đ t trùng tên ữ
ủ
ng
ươ
c g i ph thu c vào l p
ớ
ặ ng th c và cho phép xác đ nh ph ộ ượ
ị ụ
ọ
ợ ng. Ví d : Đ nh nghĩa hai đ i t
ng "hinh_vuong"
ả ph ứ ươ th c thích h p nào đ ứ c a đ i t ố ượ ủ ị ụ
ng th c chung là
ứ ế
ươ
ọ
ố ượ ộ ng th c này, n u đ i ố ng là "hinh_vuong" nó s tính theo công
ng là "hinh_tron".
và "hinh_tron" thì có m t ph ươ "chu_vi". Khi g i ph ứ t ượ ẽ th c khác v i khi đ i t ứ
ố ượ
ớ
7/30
8.3 8.3 Tính đa hình
Ví d :ụ
class A_Object {
// … void method_1(){ // …
}
} class B_Object extends A_Object {
// … void method_1(){ // …
}
}
8/30
8.3 8.3 Tính đa hình
class C {
public static void main(String[] args){
A_Object arr_Object = new A_Object[2]; B_Object var_1 = new B_Object(); arr_Object[0] = var_1; A_Object var_2; for (int i=0; i<2; i++){
var_2 = arr_Object[i]; var_2.method_1();
}
}
ng
ẽ ọ
ươ
ự
ứ
ể
ẽ ọ
ươ
ự
ứ
ư
ể
ng nào c a b t kỳ l p con nào c a l p A_Object. Ng
ế ế c l ượ ạ
ể ấ
ế
ớ
} i = 0, var_2 có ki u là B_Object, var_2.method_1() s g i th c hi n ph ể ệ th c method_1 c a l p B_Object; i = 1, var_2 có ki u là A_Object, ủ ớ ng th c method_1 c a l p var_2.method_1() s g i th c hi n ph ủ ớ ệ A_Object. Bi n đ i t ế t ượ c a l p con không th tham chi u đ n b t kỳ đ i t ủ ớ
ng ki u A_Object nh var_2 có th tham chi u đ n b t kỳ đ i ố ố ượ ấ i m t bi n ộ ủ ng nào c a l p cha. ủ ớ
ủ ớ ấ ế
ố ượ
ế
ể
9/30
8.3 8.3 Tính đa hình
c dùng đ thay cho superclass
ừ
ượ
ể
T khóa super: đ Dùng super đ g i m t contructor c a superclass, ho c g i m t ể ọ
ặ
ộ
ọ
ph
ủ ụ ọ
ươ
ộ ng th c c a superclass. Ví d g i Superclass Contructor: super(), ho c super(tham_s ) ố
i dòng đ u tiên c a subclass constructor
ứ ủ ặ L nh trên ph i đ ả ượ
ệ
ủ
ầ
và là cách duy nh t đ g i m t superclass constructor.
ộ
c đ t t ặ ạ ấ ể ọ
ng th c c a Superclass: super.methodName(tham_s ), Ví
ố
ươ
ứ ủ
G i ph ọ d :ụ double findVolume() {
return super.findArea() * length;
}
10/30
8.3 8.3 Tính đa hình
ươ
Ch ng ph ồ
ng
ệ
ủ
ng th c (Overriding Method): ươ
ứ
ủ ớ Circle nên đ
ứ subclass thay đ i s th c hi n c a ph ổ ự ự th c trong superclass Ví d , ụ findArea c a l p
ượ ề ặ
ể
ệ
c ch ng ồ trong l p ớ Cylinder đ tính di n tích b m t hình tr .ụ Ph
ng th c trong subclass ph i có cùng
ươ
ứ
ươ
ủ
ể
ứ
ả ng và ki u ng th c, s l signature (tên ph ể ố ượ ứ c c a c a các tham s theo th t cho tr ủ ướ ứ ự ố ng chúng) và cùng ki u d li u tr v v i ph ươ ả ề ớ ữ ệ th c trong superclass (Overloading method có cùng tên, nh ng ph i khác signature).
ư
ả
11/30
8.3 8.3 Tính đa hình
ứ
M t ph ộ ậ
ể ượ c → không th ch ng m t ph ồ ể
c ch ng khi nó có th ể ng th c ươ
ồ ộ
ứ
ng th c ch có th đ ỉ ươ truy c p đ ượ riêng (private method).
ng th c tĩnh (static method) có th đ
ể ượ
c k ế
ứ
M t ph ộ ừ
c ch ng. ồ
th a, nh ng không th đ ế
ươ ư Khi ch ng, n u ph ươ ồ ể
ể ượ ng th c trong superclass là ứ ổ
ươ ươ
ng th c ch ng trong ồ ứ ng th c trong ứ ng th c ch ng trong ồ ứ public.
ươ ả
ắ
ng d li u (hidding data field): n tr
ng d ữ
ộ ườ
Ẩ ữ ệ
ủ ớ
c đ t cùng tên v i m t tr
ườ ng d li u c a l p con ng d li u c a l p cha.
protected thì có th thay đ i ph subclass thành public. N u ph ế superclass là public thì ph subclass b t bu c cũng ph i là ộ n tr ữ ệ Ẩ li u c a l p cha là vi c m t tr ệ đ ượ
ườ ủ ớ ặ
ộ ườ
ệ ớ
ủ ớ
ữ ệ
12/30
ớ
8.4 8.4 L p Object
M i l p trong Java đ u đ
l p
ọ ớ
ề
ượ
c th a k t ừ
c
ế
ượ
ế ừ ớ ự ế ừ
c t o thì superclass c a nó là
ị
ng
java.lang.Object. N u không có s k th a nào đ xác đ nh khi m t l p đ ủ ượ ạ ộ ớ ng th c c a l p Object th l p Object. Các ph ườ ủ ớ ứ ươ ớ đ ử ụ ượ
c s d ng là: public boolean equals(Object obj) public int hashCode() public String toString()
Ph
ứ
ằ
ng th c equals: So sánh b ng nhau v m t tham ả ề true n u hai bi n cùng tham chi u đ n
ề ặ ế
ế
ế
ế
ng.
ươ chi u, tr v ế m t đ i t ộ ố ượ
object1.equals(object2); //So sánh b ng nhau theo
ằ
tham chi u ế
13/30
ớ
8.5 8.5 Cú pháp l p g c ố
Đa hình cho phép các ph
ươ
ng th c đ ứ
ượ
chung cho m t d i r ng các tham s đ i t
c s d ng ử ụ ng.
ộ ả ộ
ố ố ượ
ế
ộ
ể
ẽ
ậ
ấ
ộ
Nên l p trình theo cách dùng chung: khai báo m t bi n có ki u superclass, nó s có th ch p nh n m t giá tr ị c a b t kỳ ki u subclass nào. ủ
ng, ví d
ậ ể ấ Ép ki u đ i t ể
ể ố ượ
ụ
m(new Student()); th c hi n gán đ i t
ố ượ
ệ
ộ
ự tham s ki u Object, t
ở ng đ
ố ể
ng t o b i new Student() cho m t ớ
ạ ươ
ươ
ệ
ng v i hai l nh: ầ
ể
ng
Mu n n đ nh obj (ki u Object) là m t đ i t ể
ị
ộ ố ượ
ng minh
ể ườ
Object obj = new Student(); // ép ki u ng m m(obj); ố ấ Student: Student std = (Student) obj; //ép ki u t t Student std = obj; Không vi
ế
14/30
ớ
8.5 8.5 Cú pháp l p g c ố
ử
ố ượ
ể
c đó c n ch c ch n r ng đ i t
ng thành công, ng c n ép ki u là
ầ
Toán t ướ ộ
ắ ủ ớ
ầ ể ệ
ể ử
instanceof: Đ ép ki u đ i t ể tr ố ượ ắ ằ m t th hi n c a l p kia. Do đó ph i dùng toán t ả instanceof đ ki m tra đi u đó, ví d : ụ ề
c khai báo ki u Object */
ể
/** Gi /** Th c hi n ép ki u n u myObj là m t instance c a
ượ ể
ủ
ế
ộ
ể ể s myObj đ ả ử ệ ự Cylinder */
if (myObj instanceof Cylinder) { Cylinder myCyl = (Cylinder)myObj; System.out.println("The tich hinh tru la " +
myCyl.findVolume();
… }
15/30
ậ
ạ
8.6 8.6 Ph m vi truy c p
ng
Ph m vi c a đ nh danh: Là ph n mã ch
ươ
ạ trình
ị
Khi m t đ nh danh c c b đ
c phép s d ng đ nh danh đó. c khai báo cùng này là n cho ẩ
ầ ử ớ ẩ
ừ
B n m c truy c p ph n t
l p: public,
ế Ph n t s d ng t ử ụ ố
ứ
ậ
ầ ị ủ đó nó đ ử ụ ượ ở ộ ượ ụ ộ ị l p, ph n t tên v i m t ph n t ầ ử ớ ầ ử ộ ớ đ n khi k t thúc th c hi n kh i đó. ố ệ ự ế c truy c p b ng vi c l p n có th đ ệ ằ ậ ể ượ l p đó. khoá this cùng v i ph n t ầ ử ớ ớ ầ ử ớ protected, default, và private
16/30
ậ
ạ
8.6 8.6 Ph m vi truy c p
17/30
ậ
ạ
8.6 8.6 Ph m vi truy c p
Ví d :ụ
18/30
ậ
ạ
8.6 8.6 Ph m vi truy c p
Kh năng truy c p tăng d n, t
ả
ầ
ừ private, default (no
ậ modifier), protected, đ n ế public
ẩ
ủ ớ
private: n hoàn toàn các thành ph n c a l p. protected: đ
ậ
ấ
ở
ặ
khóa trên ch có th s d ng cho các thành ph n
Hai t
ầ c truy c p b i các l p con trong b t kỳ gói ớ ượ nào, ho c các l p trong cùng gói. ớ ể ử ụ
ầ
ỉ
ừ c a l p, không th s d ng cho l p. ủ ớ
ể ử ụ
default modifier (no modifier): đ
b t kỳ l p
ậ ừ ấ
ớ
ớ c truy c p t ượ
c truy c p t
nào trong cùng gói. ượ
ậ ừ ấ
c s d ng cho các
ử ụ
ầ
Chú ý: Các ký hi u -, #, + đ
ể ể
thành ph n c a l p, cũng nh s d ng cho chính l p. ớ c s d ng đ bi u di n ễ private, protected, và
ng ng các t
public: đ b t kỳ l p nào. ớ public và default modifier có th đ ể ượ ư ử ụ ủ ớ ử ụ ượ ệ b nghĩa là ừ ổ
t ứ ươ public.
19/30
ộ ớ
ự
ệ
ố
8.7 8.7 Th c hi n m t l p g c
ộ
ầ
ng th c t o c a ủ ứ ạ ươ c tiên (ho c ngay t ừ ặ ặ ự ộ ở ạ khóa super, ho c t ể ạ
ừ
M t subclass constructor luôn g i ph ọ l p cha (superclass constructor) tr ướ ớ đ ng khi l nh đ u tiên g i v i t ọ ớ ừ ệ không có l nh g i đ n super) đ t o và kh i t o các ọ ế ệ superclass. thành viên th a k t ế ừ Signature c a m t ph ươ ộ
ng th c ch a tên ph ươ ủ
ng và ki u c a các đ i s c a nó theo tr t t ủ ể ng th c, ứ đã ậ ự ứ ứ ố ố ủ
i ph ứ ươ
ề ứ ng th c (overloading method) là vi c s ử ng th c nhi u h n m t l n, m i l n v i ớ ệ ỗ ầ ộ ầ ơ
Ý nghĩa c a quá t
s l ố ượ cho Quá t ụ ộ
ứ
i ph ượ
ng tham s , ki u tham s , ố
20/30
ả d ng tên ph ươ m t Signature khác nhau. ng th c: M t s ph ng th c ứ ươ ộ ố ươ ả ủ c đ nh nghĩa v i các t p đ i s c a cùng m t tên đ ố ố ậ ớ ị ộ ủ khác nhau (trên c s s l ố ể các tham s ) ho c tr t t ơ ở ố ượ ố ậ ự ặ
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
Khi khai báo m t bi n thu c ki u d li u c s , vùng ơ ở ộ c phân ph i ố ị ủ
ể
ộ ữ ộ ớ ủ ư ượ ể
ữ ệ ế nh đ l u tr m t giá tr c a ki u đó đ cho nó.
Khi khai báo m t bi n thu c ki u tham chi u, nó s l u ẽ ư ộ c tìm
ế ộ
ế ng có th đ ể ớ ơ ố ượ ể ượ ỉ ủ
21/30
tr đ a ch c a vùng nh , n i đ i t ữ ị th y.ấ
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
Sao chép c n (shallow copy) và sao chép sâu (deep
ạ
Sao chép c n s sao chép toàn b các tr
copy):
ng d li u ộ ườ ạ
ự ế ng tham chi u đ n b i các tr ườ ế ở ẽ ồ ả ố ượ ữ ệ ệ ng d ữ
Sao chép sâu s sao chép toàn b các tr
l p, bao g m c các tham chi u, và không th c hi n sao ớ chép các đ i t ế li u.ệ
ng d li u ẽ ộ ườ
ệ ữ ệ ư
ự c tham chi u đ n. ữ ệ ế ế
ỷ t nh ng gì đ ượ S khác nhau: Sao chép c n chia s các đ i t l p ki u nguyên thu , và còn th c hi n sao chép l u tr ữ ể ớ tách bi ự ố ượ ạ
ố ớ
ng sao chép ng sao ẻ ng l p g c, trong khi sao chép sâu t o ạ ở ố ượ ớ ố ượ ủ ả
22/30
chép v i đ i t b n sao c a riêng nó c a các đ i t ủ nh ng v trí khác nhau. ữ ị
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
23/30
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
24/30
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
Ph
ng th c t o sao chép: là ph ươ ứ ạ ươ ộ
ng có th đ ng th c t o ra m t c s d ng ử ụ
ể ượ ộ ụ
ể ệ ng không th thay đ i t ể ổ ừ
25/30
ứ ạ sao chép sâu c a m t đ i t ộ ố ượ ủ cho các m c đích khác, nh t o ra m t th hi n ư ạ (instance) m i c a m t đ i t ộ ố ượ ớ ủ ng cũ khác m t đ i t ộ ố ượ
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
M t s ph ộ ố
26/30
ng th c c a l p TextField ươ ủ ớ ứ
ng th c t o sao chép
ươ
ứ ạ
8.8 8.8 Ph
L p g c NumericField: cung c p các ph
ấ
t l p và l y tr c ti p các giá tr s t ế ị ố ừ ộ ố ượ ự ấ
ấ ủ ớ ạ ươ ố ồ
27/30
ng th c đ ể ứ ươ ố ớ ng m t đ i t thi ế ậ d n xu t c a l p TextField. Nó không ki m tra ngo i l ạ ệ ể ẫ c a đ nh d ng s , không vi ng th c ứ ế ị ủ c a l p TextField mà ch h tr ki u d li u int và double ỉ ỗ ợ ể ủ ớ t ch ng các ph ữ ệ
ậ Câu h i và bài t p Câu h i và bài t p ậ
ỏ ỏ
ấ
1. L p t ng quát nh t trong Java là gì? 2. K thu t cho phép m t l p m r ng m t l p
ớ ổ ỹ
ộ ớ
ộ ớ
ở ộ
khác đ
ậ ượ
ọ
c g i là gì? ạ ạ
ế
ạ
ề
ẽ ả
ớ
3. Hãy nêu hai d ng ph m vi mà b n bi t 4. Đi u gì s x y ra n u ta không thêm m t ộ ế constructor vào trong l p m i c a mình? 5. S khác nhau gi a sao chép c n và sao chép
ớ ủ ạ
ữ
ự sâu?
6. Trong đi u ki n nào thì sao chép c n và sao
ề
ạ
chép sâu là gi ng nhau?
ệ ố
28/30
ậ Câu h i và bài t p Câu h i và bài t p ậ
ỏ ỏ
7. Đi u gì s x y ra n u m t l p con đ nh nghĩa
ộ ớ
ươ
ị ạ
ng th c trong l p cha
ế ứ ụ ể ươ ộ
ứ
ớ
ộ ớ
ế
ị
8. Đi u gì s x y ra n u m t l p con đ nh nghĩa ng
ẽ ả ng d li u có cùng tên v i m t tr
ộ ườ
ớ
ề ẽ ả ng th c c th có cùng d ng m t ph ộ heading v i m t ph ớ c a nó? ủ ề m t tr ữ ệ ộ ườ d li u trong l p cha c a nó? ớ ữ ệ
9. Phân bi
ủ t gi a ch ng ph
ệ
ữ
ươ
ồ (overriding) và n tr
ẩ
ườ 10. Ph n nào c a giao di n l p cha là không th ể
ng th c ứ ng d li u (hidding). ữ ệ ệ ớ
đ
ừ
ầ ượ
ủ ế
ộ ng th c nh th nào?
c th a k ? ủ c a m t ph ủ
ươ
ộ
11. Cú pháp c a m t constructor khác cú pháp ứ
ư ế
29/30
ậ Câu h i và bài t p Câu h i và bài t p ậ
ỏ ỏ
ự
12. Xây d ng l p Circle (hình tròn) có thu c tính r (bán ng th c t o không
ớ ị
t l p giá
ứ ạ
ộ ứ ạ ươ ng th c t o có tham s thi ế ậ ố ệ
ứ
ể
13. Xây d ng l p Cylinder (hình tr ) th a k t
Circle, có
kính) m c đ nh là 1.0. Các ph ặ tham s và ph ươ ố tr cho r. Ph ng th c findArea() đ tính di n tích ươ ị c a Circle. ủ ự
ế ừ
ụ
ừ
ớ
ị
ộ
ng th c t o
ươ
ặ ố
ươ ng th c
ứ ạ ố
ề ng th c t o không tham s và ph ươ
t l p giá tr cho d. Ph ị
ế ậ
ứ
ề ặ ủ
14. Vi
ệ ng trình t o m t đ i t ạ
ộ ố ượ
ng
thêm thu c tính d (chi u cao) m c đ nh là 1.0. Các ph ứ ạ có tham s thi findArea() đ tính di n tích b m t c a Cylinder. ể ng Circle và m t ộ ỗ ố ượ
ươ ng Cylinder. In ra di n tích c a m i đ i t ệ
t ch ế đ i t ố ượ
ủ
30/30