Chuyển đến nội dung chính

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

Nạp chồng – Overloading :

Khái niệm

Tương tự như khái niệm nạp chồng phương thức trong C++, trong java, nạp chồng phương thức (overloading method) là hiện tượng nhiều phương thức có cùng tên, tuy nhiên số lượng tham số hoặc kiểu của tham số trong các phương thức này là khác nhau.
Chú ý: Các phương thức có cùng tên, cùng danh sách tham số, tuy nhiên, kiểu trả về khác nhau không được xem là hiện tượng overload.

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

Khái niệm và đặc điểm

Override là hiện tượng một phương thức thuộc lớp cha được định nghĩa lại ở lớp con.
Đặc điểm:
  • Phương thức override và được override phải có chung kiểu trả về, tên phương thức và danh sách tham số.
  • Override chỉ xảy ra giữa các lớp có quan hệ kế thừa.
  • Một phương thức ở lớp cha được override ở lớp con thì phương thức override ở lớp con không được phép thu hẹp tầm vực của phương thức đó ở lớp cha.
  • Phương thức ở lớp cha được override ở lớp con thì phương thức override ở lớp con không được phép phát sinh những ngoại lệ kiểm tra (checked exception) khác loại hoặc không có quan hệ kế thừa với các ngoại lệ được ném ra từ phương thức đó ở lớp cha.
  • Sử dụng từ khóa super để gọi phương thức được override ở lớp cha tại phương thức override ở lớp con.
- 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 .

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...