Bổ trợ kiến thức Java cơ bản cho khóa học lập trình android (phần 7)

Không chỉ cung cấp cho các bạn những kiến thức về android mà ngay từ đầu khóa học lập trình android, ITP sẽ luôn hỗ trợ các bạn làm quen với ngôn ngữ lập trình, những kiến thức cơ bản phục vụ suốt quá trình học là lập trình sau này.
Ở bài viết hôm nay chúng ta sẽ cùng tìm hiểu hai khái niệm dễ gây lẫn lộn khi lập trình: nạp chồng phương thức (Overload) và ghi đè phương thức (Override).
Nếu chỉ nhìn lướt qua về hình thức của hai phương thức này thì chắc chắn rất nhiều người nhầm lẫn:

khóa học lập trình android - nạp chồng, ghi đè


Vậy thế nào là nạp chồng phương thức? Thế nào là ghi đè phương thức?
1. Nạp chồng – Overloading:
Nạp chồng phương thức là các phương thức nằm trong cùng một lớp, có cùng tên với nhau những có danh sách đối số khác nhau. Hàm tạo cũng có thể được nạp chồng, tùy theo ta gọi đối số thế nào mà nó sẽ gọi hàm tương ứng. Nạp chồng là hình thức đa hình (polymorphism) trong quá trình biên dịch (compile time).
VD : lớp con người và lớp con chó kế thừa từ lớp động vật có vú , phương thức sủa sẽ bị nạp chồng tùy vào đối số mà ta đưa vào;
class DongVatCoVu{
protected String ten;
protected Int tuoi;
}
class ConCho extends DongVatCoVu{
String maulong;
String giong;

// phương thức sủa số 1
void sua()
{
System.out.print(“Sủa 1 lần”);
}

// phương thức sủa số 2
void sua(int n)
{
for(int i=0;i<n;i++)
System.out.print(“Sủa n lần”);
}
}class ConNguoi extends DongVatcoVu{
String mauda;
String maumat;

// phương thức nói chuyện số 1
void noichuyen()
{
System.out.print(“Hello”);
}
// phương thức nói chuyện số 2
void noichuyen(int n)
{
for(int i=0;i<n;i++)
System.out.print(“Hello”);
}
}class main
{
public static void main (String [] args)
{
// khởi tạo đối tượng a từ lớp con chó
ConCho a = new ConCho();
a.ten = “BEN”;
a.tuoi= 2;
a.maulong=”Mau Den”;
a.giong = “BecGie”;
a.sua(); // ở đây ko truyền đối số cho phương thức sủa nên nó sẽ gọi đến phương thức sủa số 1
a.sua(5); // ở đây truyền số 5 cho phương thức sủa nên nó sẽ gọi đến phương thức sủa số 2

// khởi tạo đối tượng b từ lớp con người
ConNguoi b = new ConNguoi();
b.ten = “Nguyen Hữu Hải”;
b.tuoi = 22;
b.mauda =”mau vang”;
b.maumat=”mau den”;
b.noichuyen(); // gọi đến phương thức nói chuyện số 1
b.noichuyen(5); // gọi đến phương thức nói chuyện số 2

}
}

2. Ghi đè – override:
Ghi đè là phương thức đã xuất hiện ở lớp cha và xuất hiện tiếp ở lớp con. Khi đối tượng thuộc lớp cn gọi phương thức thì sẽ chọn lựa và chạy theo phương thức trong lớp con. Nếu lớp con không có phương thức đó thì mới lên kiếm ở lớp cha để chạy. Ghi đè là hình thức đa hình trong quá trình thực thi.
VD :
class DongVatCoVu{
protected String ten;
protected int tuoi;
protected void chay() //phương thức chạy ở lớp cha
{
System.out.println(“Chay bang 4 chan !”);
}
}
class ConCho extends DongVatCoVu{ // lớp con chó hoàn toàn ko có phương thức chạy nên nó sẽ kiếm phương thức chạy từ lớp cha để chạy
String giong;
String maulong;

protected void sua(int n)
{
for(int i=0;i<n;i++)
System.out.println(“Gau gau”);
}

}
class ConNguoi extends DongVatCoVu{
String diachi;
protected void noichuyen(int n)
{
for(int i=0;i<n;i++)
System.out.println(“Hello”);
}
protected void chay() // phương thức chạy ở lớp con người
{
System.out.println(“Chay bang 2 chan !”);
}
}
public class Main {

public static void main(String[] args) {
ConCho a = new ConCho();
a.ten=”Ki”;
a.tuoi=2;
a.giong=”Becgie”;
a.maulong=”Vang”;
a.sua(5);
a.chay(); // gọi phương thức chạy

ConNguoi b = new ConNguoi();
b.ten=”Nguyen Hữu Hải”;
b.tuoi=22;
b.diachi=”Sài Sơn – Quốc Oai – Hà Nội”;
b.noichuyen(3);
b.chay(); // gọi phương thức chạy
}
}
Ở ví dụ trên, lớp "con chó" ko có phương thức chạy, nó sẽ được lấy ở lớp cha để chạy, còn lớp con người có phương thức chạy, nó sẽ gọi phương thức chạy ở lớp con người .
Một số quy tắc sử dụng phương thức overriding:- Danh sách đối số nên giống hoàn toàn với phương thức được overriden.
- Kiểu trả về nên giống (hoặc là kiểu con) với kiểu trả về của phương thức được overriden được mô tả trong lớp cơ sở.
- Mức độ truy cập bị hạn chế hơn nhiều so với phương thức được overriden ở lớp cơ sở.
- Các phương thức instance chỉ có thể overriden nếu chúng kế thừa từ lớp cơ sở.
- Các phương thức được mô tả final (trong java) không được overriden.
- Các phương thức được mô tả static thì không overriden nhưng được mô tả lại.
- Các phương thức không kế thừa sẽ không được overriden (hiển nhiên)
- Trong một lớp dẫn xuất nằm cùng gói với lớp cơ sở của các thể hiện (instance), chúng ta có thể override tất cả các phương thức của lớp cha mà không được khai báo final hoặc private.
- Đối với các lớp dẫn xuất nằm khác gói với lớp cơ sở, chỉ có thể override các phương thức không phải final được khai báo là public hoặc protected.
- Các hàm tạo không thể overrider
Đây là hai khái niệm quan trọng và nó được sử dụng rất nhiều khi lập trình ứng dụng android. Do đó các bạn nên chú ý nắm bắt thật tốt và phân biệt rõ ràng cách sự dụng và những trường nào thì nên vận dụng cái nào. Hiểu sâu, hiểu rõ sẽ giúp bạn lập trình tốt hơn.

0 nhận xét:

Copyright © 2013 ĐÀO TẠO LẬP TRÌNH TẠI HÀ NỘI and Blogger Templates - Anime OST.