ươ

Ch

ng 8

ố ượ

L p và Đ i t

ng

Chương 8: Lớp và Đối tượng

ố ượ

o Đ i t

ng và l p.

ươ

o Thu c tính và ph

ứ ủ ớ ng th c c a l p

o Hàm t oạ

ừ ổ

o T  b  nghĩa (public, private, protected).

o T  khóa this.

o Tính đóng gói

o Tính đa hình

ế ừ o Tính k  th a

ừ ượ

o L p tr u t

ng

Đối tượng và lớp

o Một đối tượng biểu diễn một thực thể cụ thể,

o Lớp là mô tả trừu tượng cho một đối tượng cụ

riêng biệt trong thế giới thực

thể.

o Đ i t

ự ượ ọ ng đ c xây d ng t l p nên đ c g i là

ố ượ ượ ể ệ ủ ớ ừ ớ th  hi n c a l p (class instance).

Đối tượng và lớp

o Lớp chứa:

§ Tên class

§ Các thu c tính (properties) mô t

ả ạ  các tr ng thái

ộ ủ ố ượ (state) c a đ i t ng.

§ Các ph

ươ ở ạ ứ ng th c kh i t o (constructor)

§ Các ph

ươ ứ ả ng th c (methods) mô t các hành vi

ủ ố ượ (behavior) c a đ i t ng

Khai báo lớp (class)

class    {

ề ố ề ố

ộ ủ ớ  //khai báo các thu c tính c a l p ể ữ ệ  ;        ể ữ ệ  ;

//các hàm t o ạ constructor1   constructor2

ươ

ứ ng th c ể ề ố

ả ề ể

//các ph ề ố < method1 >(< method2 >()

}

Khai báo lớp (class)

o class: là t

ừ ủ  khóa c a java

o

ặ ớ o ClassName: là tên đ t cho l p

ế

ầ ữ ệ ủ ớ ộ field_1, field_2: các thu c tính (các bi n, hay các  thành ph n d  li u c a l p)

o constructor: là ph

ươ ở ạ ứ ự ố ng th c xây d ng, kh i t o đ i

ượ t ủ ớ ng c a l p.

o method_1, method_2: là các ph ử

ươ

ể ệ ủ ứ ộ

ng th c th  hi n  ộ các thao tác x  lý, tác đ ng lên các thu c tính c a  l p.ớ

Ví dụ khai báo lớp

class ConNguoi{

ộ Thu c tính

String ten; int tuoi; double hsl;

ở ạ Hàm kh i t o

ConNguoi(){ } ConNguoi(String t1, int t2){      ten = t1;      tuoi = t2; }

ươ

Ph

ứ ng th c

public void tangLuong(double d1){      hsl = d1; }

}

Thuộc tính của lớp

ộ ớ ư ữ ệ o Vùng d  li u (fields) hay thu c tính (properties) c a  c khai báo bên trong l p nh  sau: ớ ượ l p đ

class     {

ủ ớ

ề ố

ộ // khai báo các thu c tính c a l p ể ữ ệ   ; // …

}

Thuộc tính của lớp

o :

ị ấ ủ

ể ố ớ ộ ớ ườ ủ

ườ ề ố Đ  xác đ nh quy n truy xu t c a các đ i  ố ề ộ ng khác đ i v i thu c tính c a m t l p ng i ta  ề ố  sau: ng dùng các ti n t ượ t th

§ M c đ nh ặ ị

§ public

§ private

§ protected

o : Các

ả ề ể ể ơ ở ư ki u c  s  nh  int, float,..

o : Tên thu c tính (tên bi n).

ế ộ

Từ bổ nghĩa chỉ phạm vi truy xuất

Từ bổ nghĩa chỉ phạm vi truy xuất

Ví dụ thuộc tính của lớp

Thuộc tính của lớp

ượ

c phép truy c p t

bên ngoài

private không đ

ặ ị

 OK

(XeMay và Xe2Banh cùng chung 1 gói XeDongCo) ậ ừ ộ ­ Thu c tính  l p.ớ ­ M c đ nh, public, protected

Thuộc tính của lớp

không đ

c ượ

m c đ nh, private, protected

gói bên ngoài. ượ

ấ ỳ

c quy n truy c p trong b t k  gói

(Xe2Banh và XeBo không cùng 1 gói) ặ ị ộ ­ Thu c tính  ậ ừ phép truy c p t ­ public  OK (đ nào)

Thuộc tính của lớp

ủ ớ

ượ

c phép truy

private c a l p cha không đ

ế ừ

 OK

(HonDa và Xe2Banh trong cùng gói) ộ ­ Thu c tính  ậ ừ ớ c p t  l p con k  th a. ặ ị ­ M c đ nh, public, protected

Thuộc tính của lớp

ủ ớ

ặ ị

ượ

c a l p cha không đ

c phép

l p con k  th a n m bên ngoài gói.

(XeDap và Xe2Banh không cùng chung gói) ộ ­ Thu c tính  m c đ nh, private ế ừ ằ ậ ừ ớ truy c p t ­ public, protected  OK

Phương thức setter và getter

o Nguyên t c chung: Dùng private cho thu c tính và public  ậ

ứ  truy c p các thu c tính khi nó

ắ ươ ng th c.  cho ph là private?

Phương thức setter và getter

o Ph

ộ ị ng th c setter: gán giá tr  cho các thu c tính

ươ ứ ủ ố ượ c a đ i t ng.

o Ph ượ t

ủ ố ả ề ứ ộ ng th c setter: tr  v  các thu c tính c a đ i

ươ ng.

ộ ọ ả ọ o Click ph i chu t ­> ch n Source ­>ch n  Geneate

o Ví d :ụ

ộ ọ Getters and Setters ­> ch n các thu c tính.

- L p sinh viên có 2 thu c tính

ộ ớ

+ H  tênọ

+ Tu iổ

ự ươ ứ ng th c setter và getter cho Yêu c u: ầ xây d ng ph

ộ các thu c tính trên.

Phương thức setter và getter

Phương thức của lớp

o Hàm hay ph

ứ ố

ng th c (method) trong Java là kh i  ủ ươ ệ ử ứ ự

ươ

ứ ng th c: ả ề

ng th c>(

ươ    Khai báo ph ể ề ố    )ố

{

ố ệ ;

}

public class XeMay{

public String nhasx; public float tinhGiaBan() {  return 1.5 * chiphisx;

}

}

ữ ệ ệ l nh th c hi n các ch c năng, các hành vi x  lý c a  ớ l p lên vùng d  li u.

Phương thức của lớp

o :

ấ ủ ứ ủ ớ ng th c c a l p ng

ố ề ố Đ  xác đ nh quy n truy xu t c a các đ i  ề ể ườ ươ ố ớ i  ng khác đ i v i các ph ề ố ườ  sau:  ng dùng các ti n t ượ t ta th

public, protected, private, static, final, abstract,  synchronized

o :

ể ả ề Có th  là ể ki u void , ki u c  s ể ơ ở hay

ể m t ộ l pớ .

o

o : ố

ươ ướ ố ứ ng th c>: ặ đ t theo qui c gi ng tên

ể ỗ có th  r ng

Phương thức của lớp

o public, protected, private.

o static:

ươ

ấ ả

ể ệ ủ

§ Ph

ng th c l p

ứ ớ dùng chung cho t

t c  các th  hi n c a

l p.ớ

ố ượ

ủ ng c a

c th c hi n k  c  khi không có đ i t ươ

§ Có th  ể đ ượ ứ ớ l p ch a ph

ệ ự ứ ng th c đó

ể ả .

o

ượ

này

không đ

c khai báo

ng th c có ti n t ẫ

ề ố ấ

final: ph ớ ch ngồ

ứ ươ  các l p d n xu t.

o abstract:

ươ

§ Ph

ng th c

ầ ứ không c n cài đ t

ặ  (không có source code).

ẽ ượ

ấ ừ ớ

c hi n th c (cài đ t) trong các l p d n xu t t

l p

§ S  đ này.

o synchoronized: dùng đ  ngăn các tác đ ng c a các đ i

ượ

ố ượ

t

ng khác lên đ i t

ng đang xét trong khi đang đ ng b

hóa. Dùng trong l p trình multithreads.

ở ạ ố ượ

ể ng (th

Khai báo ­ kh i t o đ i t hi n)ệ

public class ConNguoi{       public String HoTen;       phublic String CMND;       public String thongTin(){            }

return  CMND;  }

Phân biệt kiểu cơ sở và kiểu đối tượng

o Kiểu cơ sở:

int i = 1;

ố ượ ể o Ki u đ i t ng:

ConNguoi SV1  = new ConNguoi();

o Sau khi t o: SV1

ạ SV1: ConNguoi

HoTen = “” ………

Phân biệt kiểu cơ sở và kiểu đối tượng

Truy xuất đối tượng

o Tham chiếu dữ liệu của đối tượng:

bienDoiTuong.duLieu

o Gọi phương thức của đối tượng: bienDoiTuong.tenPhuongthuc

public class ConNguoi{

public String HoTen; public void hienTT(){ System.out.println(“……………..”);

}

public static void main( String args[ ] ){ ConNguoi SV1 = new ConNguoi(); SV1.HoTen = “Nguy n Văn A”; SV1.hienTT();

}

ứ  đ c bi ặ ở ạ ạ ph ọ ự ộ ể ệ ủ

Hàm xây d ng/ Hàm t o  (Constructor) ươ ộ o Là m t lo i   đ ng  o Dùng g i t

ệ ủ ớ t c a l p. ng th c ộ khi kh i t o m t th  hi n c a

l p.ớ

ể ữ ị ị

ượ ọ ế ớ ớ và đ

ừ ở ể o Có th  dùng đ  kh i gán nh ng giá tr  măc đ nh. ị ả ề. o Không có giá tr  tr  v ố ặ o Có th  có tham s  ho c không có tham s . ả o Ph i có  c g i đ n khi dùng   khóa t ố cùng tên v i l p  new

ườ ồ ể ươ

ễ ể ng đ  an toàn, d  ki m soát và  ng trình chúng ta nên khai  ớ

ế

Hàm xây d ng/ Hàm t o  (Constructor) o L u ý:ư  thông th ủ làm ch  mã ngu n ch ộ báo m t constructor cho l p. ộ ớ ẽ

o N u m t l p không có constructor thì  ấ

ộ ặ ớ § Java s  cung c p cho l p m t constructor m c

ị đ nh (default constructor).

ộ ữ ế ủ ớ ẽ ượ

§ Nh ng thu c tính, bi n c a l p s  đ ị ặ ị ị

ườ ố

ở ạ c kh i t o  ị ng là giá tr  0,  ị ố ượ ng giá tr

ở b i các giá tr  m c đ nh (s : th ể ậ ể ki u lu n lý là giá tr  false, ki u đ i t null, …)

Hàm xây d ng/ Hàm t o  (Constructor) ố ố ạ o Hàm t o có đ i s

ConNguoi(String t) {  HoTen = t;

}

o Hàm t o không có đ i s

ố ố

ạ ConNguoi(){

ễ HoTen = “Nguy n Văn A”;

ố ượ ử ụ ạ } o T o đ i t ng s  d ng hàm t o

ạ  ConNguoi SV1 = new ConNguoi(“Nguyen Van A);

Hàm xây d ng/ Hàm t o  (Constructor)    public class ConNguoi { public CoNguoi() { } public ConNguoi(String s_HoTen, String s_CMND){

HoTen = s_HoTen; CMND = s_CMND;

} public static void main( String args[ ] ){

ConNguoi p1= new ConNguoi(“Lan”, “351xxxxxx”);     ConNguoi p2= new ConNguoi();

o p1: có HoTen = “Lan”, CMND = 351xxxxxx o p2: có HoTen = “”, CMND = “”

}

ươ

Ch ng ph

ứ ng th c

o Vi c khai báo trong m t l p nhi u ph

ệ ề

public class XeMay{

// khai báo fields … public float tinhGiaBan(){  return 2 * chiphisx;

} public float tinhGiaBan(float huehong){  return (2 * chiphisx + huehong);

}

}

31

ộ ớ cùng tên nh ng khác tham s  (khác ki u d  li u,  ố ọ khác s  l ươ ph ứ ươ ng th c có  ể ữ ệ ố ư ố ượ ồ ng tham s ) g i là khai báo ch ng  ứ ng th c (overloading method).

ế

ươ

Các bi n, h ng, ph

ứ ng th c tĩnh

o Từ bổ nghĩa static được dùng để khai báo các biến,

hằng và phương thức sử dụng chung trong lớp.

o Hằng static:

public final static double PI=3.1416;

o Biến static:

§ Chỉ phụ thuộc vào lớp mà không phụ thuộc vào

đối tượng.

§ Biến static có thể truy cập trực tiếp bằng tên class

mà không cần bất kỳ đối tượng nào.

Cú pháp: Tên_class.Tên_biến _static

ế

Bi n không static:

Tên_đ i_t

ố ượ .Tên_bi nế

ng

§ Biến static chỉ khởi tạo một lần khi chương trình

bắt đầu thực thi

ế

ươ

Các bi n, h ng, ph

ứ ng th c tĩnh

public class BienTinh{

public static int count = 0;

public BienTinh() {

count++; a++;

public int a = 0;                          }

BienTinh.count);

public static void main(String[] args) { BienTinh b1 = new BienTinh();  System.out.println("count l n 1 = "+ System.out.println("b1.a = "+b1.a); BienTinh b2 = new BienTinh(); ầ System.out.println("count l n 2= "+BienTinh.count);

System.out.println("b2.a = "+b2.a);

ấ ả

ố ượ

} ế    }//bi n count dùng chung cho t

t c  các đ i t

ng (b1 và b2).

ế

ươ

Các bi n, h ng, ph

ứ ng th c tĩnh

public class BienTinh{

public static int count = 0;

public BienTinh() {

count++; a++;

public int a = 0;                          }

BienTinh.count);

public static void main(String[] args) { BienTinh b1 = new BienTinh();  System.out.println("count l n 1 = "+ System.out.println("b1.a = "+b1.a); BienTinh b2 = new BienTinh(); ầ System.out.println("count l n 2= "+BienTinh.count);

System.out.println("b2.a = "+b2.a);

ấ ả

ố ượ

} ế    }//bi n count dùng chung cho t

t c  các đ i t

ng (b1 và b2).

ế

ươ

Các bi n, h ng, ph

ứ ng th c tĩnh

o Ph

ươ ứ ng th c static:

§ Ch  ph  thu c và l p mà không ph  thu c vào đ i

ụ ớ ộ ố ộ

ượ ỉ ụ ng. t

§ Ph

ươ ự ế ứ ằ ng th c static có th  truy c p tr c ti p b ng

ầ ậ ể ấ ỳ ố ượ tên class mà không c n b t k  đ i t ng nào.

ớ ươ Cú pháp : Tên_l p.Tên_ph ứ ng_th c_static

§ Ph

ươ ứ ể ậ ỉ ng th c static ch  có th  truy c p vào các

public static int getNum(){

ể ậ

thành ph n static mà không th  truy c p vào các  thành ph n không static.

}

ầ ầ      return num;

Từ khóa this

ượ

ế o Thay th  cho đ i  ệ ạ ng hi n t

ố i.

t

ọ o G i các

public class SinhVien{ float DiemTB; String HoTen; ủ ớ // Contructor c a l p A public SinhVien(float so, String ten){

this.DiemTB = so; this.HoTen = ten;

constructor khác  ủ ố ượ c a đ i t

ng.

} float  tinhDiemTB() { // … } void hienThi(){

this.tinhDiemTB()

}

}

Mảng đối tượng

o Khai báo:

ConNguoi[] SV = new ConNguoi[10];

o Kh i t o:

ở ạ

for(int i=0; I < SV.length; i++){

SV[i] = new ConNguoi();

}

Mảng đối tượng

Ví dụ

o Xây dựng lớp NhanVien theo các yêu cầu sau:

§ Các thuộc tính: họ tên, HSL, LCB và số nhân viên. Trong đó LCB và số nhân viên là biến kiểu static, LCB được khởi tạo mặc nhiên là 540000, số nhân viên được khởi tạo giá trị là = 0.

§ Các hàm tạo: NhanVien() và

NhanVien(hoTen,HSL). Mỗi khi có một đối tượng được tạo thì thuộc tính số nhân viên tăng lên 1.

§ Các phương thức: tangHSL(HSL mới): Tăng hệ số

lương của một nhân viên, tangLCB(LCB mới): Tăng lương cơ bản, tinhLuong(): Tính lương NV theo công thức: Lương = HSL*LCB và inNV(): In thông tin về nhân viên và lương của nhân viên

Ví dụ

Đặc điểm OOP trong Java

ủ ậ ơ ả

o Đ   h   tr   nh ng  nguyên  t c  c   b n  c a  l p  trình  t  c   các  ngôn  ng   l p  ể

ữ ố ượ ắ ấ ả ng  (OOP),  t ng  đ i  t

§ Tính đóng gói (Encapsulation)

§ Tính đa hình (Polymorphimsm)

ể ả ặ ể ỗ ợ ữ ậ ướ h ề trình OOP,  k  c  Java đ u có ba đ c đi m chung:

§ Tính k  th a (Inheritance)

ế ừ

Tính đóng gói

ầ ữ ế ầ ấ ộ ng  gi u  đi  m t  ph n  các  chi  ố t  cài  đ t  và  ch   công  b   ra  ngoài  nh ng  gì  c n

ố ượ o Giúp  cho  các  đ i  t ỉ ổ ớ ặ ố ể ố ượ ti công b  đ  trao đ i v i các đ i t ng khác.

o Đ i t

ố ượ ố ỗ ợ ộ ng là m t thành t h  tr  tính đóng gói.

ị ơ ữ

ố ượ ữ ự

o Đ n v  đóng gói c  b n c a ngôn ng  java là class.  ng.  ủ ng là nh ng th  hi n (instances) c a

ố ượ ể ệ

ữ ộ ơ ả ủ ể Java  dùng  class  đ   xây  d ng  nh ng  đ i  t ữ Nh ng đ i t m t class.

Tính đa hình

class DongVat{

void method_1( ){  System.out.println(“Day la con vat”);}

}  class ConMeo extends DongVat {

void method_1( ) {System.out.println(“Day la con meo”);}

}  class C {

ầ ử ể

public static void main(String[] args) {   ki u A

ả // T o m t m ng 2 ph n t DongVat arr_DV = new DongVat[2]; ConMeo meo1 = new ConMeo();   arr_DV[0] = meo1; DongVat dv2; for (int i=0; i<2; i++) {   dv2 = arr_DV[i]; dv2.method_1();

}     }    }

Tính đa hình

o

ng trình trên:

ế

ươ  Vòng l p for trong đo n ch ể § V i i = 0 thì bi n dv2 có ki u là ConMeo, và l nh

ẽ ọ

ươ

ệ ng th c

ự dv2.method_1() s  g i th c hi n ph ủ ớ method_1 c a l p ConMeo. ể ế

§ V i i = 1 thì bi n dv2 có ki u là DongVat, và l nh

ẽ ọ

ươ

ệ ng th c

o Đ i t

ng dv2 có th  nh n ki u DongVat hay

dv2.method_1() s  g i th c hi n ph ủ ớ method_1 c a l p DongVat. ố ượ ConMeo.

ng thu c

o Hay nói các khác, m t bi n đ i t ế

ớ ộ l p cha   ủ ấ ng nào c a b t

o Ng

ế ủ l p con không th  tham

ố ượ ế ấ ỳ ố ượ ể có th  tham chi u đ n b t k  đ i t ớ k  ỳ l p con ượ ạ c l ế

ộ ế ớ  nào c a ủ l p cha ớ ộ i m t bi n c a  ấ ỳ ố ượ ng nào c a

.

chi uế  đ n b t k  đ i t

ể ớ ủ l p cha

Tính đa hình

o Cha tham chi u đ n đ i t

ố ượ ế ế ng con (tính đa

hình)

i thì không.

o Ng o Con k  th a thu c tính, ph

ộ ươ ứ ủ ng th c c a cha

ượ ạ c l ế ừ ế ừ (tính k  th a)

Tính kế thừa

ộ ớ

o M t l p con (subclass) có th  k  th a t

t c  nh ng

ứ ủ

ươ

ể ế ừ ấ ả ữ ộ ớ ng th c c a m t l p khác (siêu

ữ ệ vùng d  li u và ph ớ l p ­ superclass).

ọ ớ

o Khi đó chúng ta g i l p m i là l p d n xu t (derived

ừ ớ

ớ  l p cũ (superclass).

o M t l p siêu l p tr c ti p (immediate supperclass): L p  ậ ớ  A. v y l p A

ượ ế ừ ừ c k  th a t

class) t ự ế ộ ớ ớ ế ừ ừ C k  th a t  B mà l p B đ ự ế ủ ớ ộ là m t siêu l p tr c ti p c a C. ấ ể ỉ ớ extends đ  ch  l p d n xu t.  khóa  o Dùng t class A extends B{ ớ // n i dung l p

}

Tính kế thừa

• Thực tế, lớp con thường được mở rộng để chứa nhiều thông tin chi tiết và nhiều chức năng hơn so với lớp cha của nó.

Tính kế thừa

• Truy xuất superclass từ subclass: Dùng từ khóa super

– Từ khóa super được dùng để thay cho superclass,

tương tự như this thay cho đối tượng được gọi.

– super được dùng để: gọi 1 hàm tạo (contructor) hoặc

một phương thức của superclass

Gọi hàm khởi tạo của Superclass

• Cách gọi: super() hoặc super(tham_số)

• Lưu ý: Lệnh trên phải được đặt tại dòng đầu tiên trong hàm tạo của lớp con và là cách duy nhất để gọi 1 hàm tạo của lớp cha.

ườ

Khai báo t

ng minh

ườ

Khai báo không t

ng minh

Gọi phương thức của Superclass

• Cách gọi: super.method(tham_số)

• Ví dụ:

double findVolume() {

return super.findArea() * length;

}

Khai báo chồng phương thức

ậ ượ ớ ế ừ

o Tính k  th a giúp cho các l p con nh n đ ng th c

c các  ủ ớ ươ ứ public và protected c a l p

ươ ế ể ờ ứ ng th c

ằ ồ ộ thu c tính/ph cha. ồ o Đ ng th i cũng có th  thay th  các ph ủ ớ c a l p cha b ng cách khai báo ch ng.

Khai báo chồng phương thức

public class XeGa extends XeMay{

public XeGa( ) { } public XeGa(String s_nhasx, String s_model, f_chiphisx, int  i_thoigiansx);{

this.nhasx = s_nhasx; this.model = s_model; this.chiphisx = f_chiphisx; this.thoigiansx = i_thoigiansx; this.so = 0;

} public float tinhGiaBan( ) { return 2.5 * chiphisx; }

}

Ba tiền tố trong kế thừa

o

o

o

ớ ằ ẫ ấ   ớ không th  t o d n xu t ể ạ

ừ ượ ớ ng

ầ ươ public final: L p h ng, l p  ể (không th  có con). abstract: L p tr u t § Không có khai báo các thành ph n và các ph ng

th c. ứ ớ

§ L p d n xu t s  khai báo, cài đ t c  th  các  ng.

ặ ụ ể ừ ượ ấ ẽ ươ ộ ẫ thu c tính, ph ứ ủ ớ ng th c c a l p tr u t

Lớp trừu tượng

abstract class DongVat { abstract void hienThi();

}    public class ConMeo extends DongVat{

public void hienThi(){

System.out.println(“Day la con meo”);

}

}    public class ConCho extends DongVat{

public void hienThi(){

System.out.println(“Day la con cho”);

}

}

Lớp trừu tượng

o Các ph

ươ ứ ượ

ượ ề ố c khai báo dùng các ti n t ừ c khai báo là tr u

ng th c đ private và static thì không đ ượ t

ế ừ ừ ớ  l p trù t ươ abstract. o T t c  các l p k  th a t ớ ạ ấ ả t c  các ph i t ượ ứ ừ ớ ng th c t ả ng ph i  ừ  l p tr u

ng  ấ ả ị đ nh nghĩa l ượ ng. t

Phương thức Finalize

o

ỏ ư

o

ướ

ệ ố ng tr

o

ớ ấ ng. ươ

ươ

ng th c

ứ finalize() là m t ph ặ ẵ ươ

ứ ặ ệ ng th c đ c bi t  ệ ố ẹ ộ ố ượ

ộ ớ ướ

ể ữ ệ Java không có ki u d  li u con tr  nh  trong C. ẹ ẹ ẽ ọ Java có m t trình d n d p h  th ng s  d n d p vùng  ộ ố ố ượ nh  c p phát cho các đ i t c khi h y m t đ i  ượ t Ph ượ đ ẽ ọ s  g i ph

c cài đ t s n cho các l p. Trình d n d p h  th ng  ng.

ọ c khi h y m t đ i t

ứ ng th c này tr

class A{

// Khai báo các thu c tính public void method_1( ) { // …  } protected void finalize(){ ể ể         // Có th  dùng đ  đóng t ướ ơ ở ữ ệ         // vào c  s  d  li u tr

ế ố ấ ả t c  các k t n i ủ ố ượ c khi h y đ i t

ng.

}

}

Các thành phần khác

o Gói (package) ệ o Giao di n (interface)

Ví dụ về đa hình

public abstract class Shape extends Object{

public double dienTich() {

return 0.0;

} public abstract String getName();

}

Ví dụ về đa hình

public class Point extends Shape{

ọ protected int x, y; // T a đ  x, y c a 1 đi m public Point( ){ setPoint( 0, 0 ); } public Point(int xCoordinate, int yCoordinate){  setPoint( xCoordinate, yCoordinate );

} public void setPoint( int xCoordinate, int yCoordinate ){

x = xCoordinate; y = yCoordinate;

} public String toString(){

return "[" + x + ", " + y + "]";

}

ừ ượ

//cài đ t ph

ứ ng th c tr u t

ủ ớ ng c a l p cha

ươ public String getName(){   return "Point";

}  }

Ví dụ về đa hình

ủ ớ

public class Circle extends Point { protected double radius;   ọ ế public Circle(){   //ng m g i đ n constructor c a l p cha

setRadius( 0 );

ủ ớ

} public Circle( double circleRadius, int xCoordinate, int yCoordinate ){ super( xCoordinate, yCoordinate ); // g i constructor c a l p cha setRadius( circleRadius );

} public void setRadius( double circleRadius ){

radius = ( circleRadius >= 0 ? circleRadius:0 );

} public String toString(){

return "Center = " + super.toString() + "; Radius = " + radius;   }

ả ề

public String getName() // tr  v  tên c a shape{

return "Circle";

} }