Trang

Thursday, June 12, 2014

Overload - override Java (Nạp chồng - ghi đè)

Nạp chồng – Overloading :
- các phương thức nằm trong cùng 1 lớp , có cùng tên với nhau nhưng có danh sách đối số khác nhau được gọi là các phương thức nạp chồng.
- 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;
PHP:
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.tuoi2;
            
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 Anh Tuan”;
            
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
             
}
     }
}


Ghi đè – override :

- 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 con 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 (polymorphism) trong quá trình thực thi (Runtime)
VD :

PHP:
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="Tuan";
       
b.tuoi=22;
       
b.diachi="240 Tran Duy Hung";
       
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ình sẽ bổ sung thêm và giải thích từng bước,1 chương trình Java được tạo và thực thi như thế nào nhé ?
- Thông thường 1 chương trình java đi qua 5 pha bao gồm edit, compile, load, verify, execute. Các bạn xem hình bên dưới
View attachment 135 
+ Pha 1: Creating a Program
tạo 1 file với 1 chương trình soạn thảo(editor) và lưu trong ổ đĩa cứng là tenfile.java
+ Pha 2: Compiling a Java Program into Bytecodes
biên dịch (compiles) từ tenfile.java -> tenfile.class 
+ Pha 3: Loading a program into memory
load tenfile.class(chứa bytecode) từ ổ đĩa cứng và đặt bytecodes vào trong bộ nhớ. Chú ý chương trình phải được đặt trong bộ nhớ trước khi nó được thực thi.
+ Pha 4: Bytecodes Verification
Sau khi bytecodes đã được nạp vào trong bộ nhớ thì tiến hành kiểm tra xác nhận rằng bytecode là hợp lệ và không vi phạm giới hạn bảo mật của java(như virus). Pha này thuộc vấn đề chuyên sâu liên quan đến lập trình mạng mình cũng chưa hiểu rõ lắm.
+ Pha 5: Execution(or Runtime)
JVM sẽ đọc bytecode sau đó được chuyển vào ngôn ngữ lập trình cái mà máy tính có thể hiểu để thực thi chương trình

P/S: Tham khảo ebook Java How to program, seventh edition trang 40


1. Overloading

Overloading là chỉ các phương thức có cùng tên trong một Class, Nhưng các phương thức này phải khác nhau về tham số đầu vào hoặc khác nhau về kiểu kết quả trả ra.
Như vậy các phương thức này sẽ tồn tại song song trong 1 Class, Nó sẽ không bị ghi đèlên nhau.

2. Overriding

Overriding là chỉ các phương thức đã xuất hiện ở lớp cha rồi, lại tiếp tục xuất hiện trong lớp con.
Nếu đối tượng thuộc lớp con thì khi gọi tới phương thức này thì sẽ chạy theo phương thức ở trong lớp con. Còn nếu trong lớp con mà không có phương thức này, thì nó sẽ chạy theo phương thức ở lớp cha.

3. Ví dụ về Overload và Override.

public class A {
protected String xinChao() {
return “Class A”;
}
public String xinChao(String s) {
return s;
}
}
class B extends A {
@Override
public String xinChao() {
return “Class B”;
}
public static void main(String args[]) {
String thongDiep= “”;
A a = new A();
thongDiep= a.xinChao();
System.out.println(thongDiep);
B b = new B();
thongDiep= b.xinChao();
System.out.println(thongDiep);
thongDiep= a.xinChao(“This is Overloading”);
System.out.println(thongDiep);
}
}
Ở ví dụ trên.  Class A có 2 phương thức xinChao() nhưng trong 2 phương thức này khác nhau ở đối số truyền vào là biến String s. Đây chính là Overload.
Class B là lớp con của Class A, và trong Class B thì phương thức xinChao() đã được định nghĩa lại, đây chính là Override.

Difference between method overriding(Ghi đè) and overloading(Nạp chồng).
Trong OOP, overriding và overloading là 2 kỹ thuật giúp tạo nên Tính đa hình (Polymorphism), một trong những sức mạnh của lập trình hướng đối tượng. Bài viết này chúng ta sẽ tìm hiểu về khái niệm, cách dùng và tác dụng của 2 kỹ thuật nêu trên.
Trong phạm vi bài viết này chúng ta chỉ để cập đến 2 kỹ thuật này trong Method. Trong lập trình cấu trúc C, chúng ta không thể nào khai báo các function (method) trùng tên, nhưng trong OOP chỉ cần áp dụng hai kỹ thuật này, chúng ta hoàn toàn có thể làm được điều đó.
Overriding
Khi sử dụng Overriding, bạn đã thay đổi hành vi của method mà nó override. Nói đơn giản là nó đã ghi đè nội dung lên method trước đó. Lưu ý, method này phải được khai báo giống hệt method trước cả đối số và kiểu trả về.
- Overriding thường được sử dụng trong method ở lớp con.
Một số quy tắc sử dụng phương thức overriding:
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).
Chỉ có thể override các phương thức không phải final (java) được khai báo là public hoặc protected.
Overloading
Overloading đơn giản chỉ để tạo ra các method cùng tên trong cùng một Class. Nhưng các method đó phải khác nhau về đối số đầu vào (argument) hoặc kiểu trả về.
- Các method với kỹ thuật này không ghi đè mà cùng tồn tại song song.
Trong Java, sử dụng @Override trước phương thức trong một lớp chỉ rằng hàm này ghi đè một phương thức cùng tên, cùng đối số của lớp cha mà lớp này kế thừa. Ví dụ về overriding và overloading trong Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class A {
    protected String Hello() {
        return "Class A";
    }
    public String Hello(String s) {
        return s;
    }
}
 
class B extends A {
    @Override
    public String Hello() {
        return "Class B";
    }
     
    public static void main(String args[]) {
        String msg = "";
        A a = new A();
        msg = a.Hello();
        System.out.println(msg);
        B b = new B();
        msg = b.Hello();
        System.out.println(msg);
        msg = a.Hello("Overloading !!!");
        System.out.println(msg);
    }
}
Trong ví dụ trên class A có 2 phương thức Hello() nhưng đối số khác nhau thể hiện kĩ thuật Overloading (Nạp chồng), class B thừa kế từ class A nhưng định nghĩa lại Hello() thể hiện kĩ thuật Overriding (Ghi đè).

No comments:

Post a Comment