Xây dựng lớp (class)

Một phần của tài liệu GIÁO TRÌNH JAVA cơ bản (Trang 33)

Chúng ta thiết kế một Solution có một Project trong Project này có hai tập tin lớp (lop1.java và lop2.java) như hình sau:

Mã của class lop1.java:

class lop1 { int x, y, s; // Method tong() void tong() { s=x+y; } }

Bạn thấy class trên có hai phần:

 Phần dữ liệu: int x, y, s;  Phần Method: void tong() { s=x+y; }

Nếu bạn cố chạy, máy sẽ báo là không thấy main trong lớp này. Bởi vì chúng ta chỉ mới xây dựng lớp chứ ch ưa có lớp cụ thể, mà bạn thấy đấy cũng chưa có dữ

liệu và tất nhiên phải có Method main.

Hãy viết mã cho lớp 2 như sau:

class lop2

{

public static void main(String[] args)

{

lop1 m=new lop1(); //tạo lớp m cụ thể từ lop1

m.y=2; m.tong();

System.out.println("s="+m.s);

} }

Lop2 này chỉ chứa Method main. Bạn xem dòng lệnh:

lop1 m=new lop1();Cách viết này có nghĩa là tạo ra đối tượng C từ lop1.

Bây giờ bạn chạy chương trình và kết quả sẽ là s =3.

Nếu bạn khai báo thêm một đối tượng n nữa như sau: class lop2

{

public static void main(String[] args)

{

lop1 m=new lop1(); lop1 n=new lop1();

m.x=1; m.y=2; m.tong(); System.out.println("s="+m.s); n.x=111; n.y=222; n.tong(); System.out.println("s="+ n.s); } }

Thì khi chạy sẽ có kết quả:

s=3 s=333

2.7.3 Kế thừa

Trong thực tế người ta thường xây dựng một lớp từ một lớp đã có. Dùng lớp có

sẵn để xây dựng một lớp mới là một trong những nội dung quan trọng nhất của

lập trình hướng đối tượng. Nhờ khả năng này mà chúng ta xây dựng nên những (adsbygoogle = window.adsbygoogle || []).push({});

lớp ngày càng phức tạp giống như sự di truyền trong thế giới sinh vật.

Để hiểu rõ tính kế thừa, tốt nhất vẫn nên thông qua một ví dụ đơn giản như

sau: Một Solution có chứa một Project, trong Project này ta xây dựng 3 lớp có

tên lopcha.java, lopcon.java và loptinhtoan.java. Lớp con được kế thừa từ lớp

cha và loptinhtoan.java dùng để hiển thị tên cha, tuổi cha, tên con, tuổi con và tuổi trung bình của cha và con.

Mã của lopcha.java: class lopcha { String TenCha; int TuoiCha; void ShowCha() {

System.out.println("Ten cha: "+TenCha); System.out.println("Tuoi cha: "+TuoiCha); }

}

Mã của lopcon.java:

class lopcon extends lopcha //lớp con được kế thừa từ lớp cha

{

String TenCon; int TuoiCon; void ShowCon()

{

System.out.println("Ten con: "+TenCon); System.out.println("Tuoi con: "+TuoiCon); }

}

Mã của loptinhtoan.java:

public class loptinhtoan

{

public static void main(String[] args)

{

lopcon Q=new lopcon();//Q là đối tượng lớp con

Q.TenCha="Le Thanh Binh"; Q.TuoiCha=50;

Q.TenCon="Le Thanh Thu"; Q.TuoiCon=20;

Q.ShowCon();

System.out.println("Tuoi trung bi nh:"+((Q.TuoiCha+Q.TuoiCon)/2)); }

}

Khi bạn chạy sẽ có kết quả:

Trong lớp con ngoài dữ liệu và Method mới còn chứa toàn bộ dữ liệu và Method của lớp cha nhưng bị che khuất.

2.7.4 Đa hình

Điều gì sẽ xẩy ra khi trong lớp con có một Method trùng tên với lớp cha. Giả sử hai Method ShowCha() và ShowCon() cùng có tên Showc(), tuy nội dung khác nhau. Chúng ta viết lại chương trình trên: (adsbygoogle = window.adsbygoogle || []).push({});

class lopcha { String TenCha; int TuoiCha; void Show() {

System.out.println("Ten cha: "+TenCha); System.out.println("Tuoi cha: "+TuoiCha); }

}

Mã của lopcon.java:

class lopcon extends lopcha //lớp con được kế thừa từ lớp cha

{

String TenCon; int TuoiCon;

void Show() //cũng có tên Show() {

System.out.println("Ten con: "+TenCon); System.out.println("Tuoi con: "+TuoiCon); }

}

public class loptinhtoan {

public static void main(String[] arg s) {

lopcon Q=new lopcon();//Q là đ ối tượng lớp con

Q.TenCha="Le Thanh Binh"; Q.TuoiCha=50;

Q.TenCon="Le Thanh Thu"; Q.TuoiCon=20;

Q.Show();

System.out.println("Tuoi trung binh:"+((Q.TuoiCha+Q.TuoiCon)/2)); }

}

Khi chạy ta có kết quả:

Rõ ràng chương trình chỉ sử dụng Show() ở lớp con. Vậy muốn sử dụng

Show()của lớp cha thì làm thế nào? Tất nhiên phải khai báo thêm một đối tượng

nữa, cụ thể:

public class loptinhtoan {

public static void main (String[] args) {

lopcon Q=new lopcon();//Q là đ ối tượng lớp con lopcon P=new lopcha();//P là đ ối tượng lớp cha

Q.TenCha="Le Thanh Binh"; Q.TuoiCha=50;

Q.TenCon="Le Thanh Thu"; Q.TuoiCon=20;

P.Show(); Q.Show();

System.out.println("Tuoi trung binh:"+((Q.TuoiCha+Q.TuoiCon)/2)); }

} (adsbygoogle = window.adsbygoogle || []).push({});

Khi chạy ta thấy ổn, nghĩa là chương trình thực hiện Show() ở lớp cha và cả ở

lớp con. Một vấn đề khác đ ược đặt ra là: Giả sử gia đình nào đó có từ hai con trở

báo thêm đối tượng và đưa các đối tượng vào mảng, ta viết lại lớp loptinhtoan như sau:

public class loptinhtoan {

public static void main(String[] args) {

lopcha Q=new lopcha(); lopcon P=new lopcon(); lopcon R=new lopcon(); lopcon S=new lopcon();

Q.TenCha="Le Thanh Binh"; Q.TuoiCha=50;

P.TenCon="Le Thanh Thu"; P.TuoiCon=20;

R.TenCon="Le Thanh Tu"; R.TuoiCon=18;

S.TenCon="Le Thanh Van"; S.TuoiCon=16;

lopcha[] mang={Q, P, R,S}; //Mảng các đối tượng

float tb; int i;

for (i=0;i<4; i++) {

mang[i].Show();

System.out.println("---"); }

tb=(Q.TuoiCha+P.TuoiCon+R.TuoiCon+S.TuoiCon)/4; System.out.println("Tuoi trung binh:"+tb);

} }

Ta thấy mang []có kiểu thuộc lớp chac, nh ưng cũng chấp nhận các đối tượng

thuộc lớp con và với cùng một câu lệnh thực hiện Show(), ta thu đ ược các câu trả

lời khác nhau. Nhưng rõ ràng với Showt() đời con xử lý khác đời cha. C ơ chế

linh hoạt này có được là nhờ gọi Method thông qua đối t ượng vào lúc chạy chương trình. Người ta gọi quá trình đó là tính Đa hình (polymorphism). Bạn cứ tưởng tượng nếu “dòng họ” cứ phát triển mãi, có bao nhiêu thế hệ khác nhau thì có bấy nhiêu tình huống có thể khác nhau nh ưng chỉ thông qua một câu lệnh:

mang[i].Show().

Như vậy ngoài khái niệm lớp, đối tượng và kế thừa, tính đa hình là một nét

nữa góp phần làm cho tính hướng đối tượng thêm phong phú.

Một phần của tài liệu GIÁO TRÌNH JAVA cơ bản (Trang 33)