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 :ụ

class A {

ề ố ề ố

ề ố int ; String ; // Contructor c a l p A ủ ớ public A(int par_1, String par_2){

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