Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

 

Sửa ngày:

51 Lượt xem

【Nhập môn Java】 Cách sử dụng Overrride

Java

Bạn đã sử dụng Override chưa? Nó thực sự hữu ích khi bạn muốn thay đổi một phương thức của một lớp đã tồn tại để sử dụng. Điều thuận tiện là bạn chỉ cần viết lại phương thức bạn muốn thay đổi mà không cần phải viết lại biến

Override là gì

Override là khi bạn định nghĩa lại một phương thức trong lớp con với cùng một tên phương thức của lớp cha khi bạn kế thừa lớp đó. Khi thực hiện Override, bạn cần đảm bảo tên phương thức giống nhau và số lượng tham số cũng như thứ tự giống nhau.

Lưu ý rằng, lớp cha là lớp mà bạn kế thừa và là lớp cha, lớp con là lớp đã kế thừa. Ngoài ra, khi bạn sử dụng từ khóa “super”, bạn có thể vẫn sử dụng phương thức đã định nghĩa trong lớp cha mà không thay đổi nó ngay cả khi bạn đã thực hiện Override.

Lợi ích khi sử dụng

Override được sử dụng trong phương thức của lớp con được kế thừa. Đầu tiên, về lợi ích của việc kế thừa, đó là bạn có thể tái sử dụng mã nguồn và giảm lượng mã bạn phải viết. Ngay cả khi có sự thay đổi cần thiết, bạn cũng chỉ cần thay đổi một số ít chỗ.

Nhờ Override, bạn có thể giảm số lượng chỗ cần thay đổi khi cần sửa đổi phương thức. Các biến thành viên của lớp có thể được tái sử dụng nguyên vẹn, và bạn chỉ cần định nghĩa lại phương thức bạn muốn thay đổi.

Override thực hiện triết học của đa hình (polymorphism) trong việc “tái sử dụng trong khi vẫn có thể thay đổi tự do”. Về lợi ích của việc kế thừa từ lớp cha, bạn có thể xem chi tiết ở đây.

Sự khác biệt giữa Override và Overload

Có một từ ngữ tương tự là Overload. Vì họ thường bị nhầm lẫn, chúng ta hãy giải thích ngắn gọn.

Overload là khi bạn định nghĩa một phương thức với cùng một tên, nhưng số lượng hoặc thứ tự của tham số khác nhau. Trong khi đó, Override mà chúng ta đang giới thiệu ở đây là khi bạn định nghĩa lại một phương thức trong lớp con với tên và số lượng tham số giống nhau nhưng thực hiện lại nó.

Hãy chắc chắn không bị nhầm lẫn nhé!

Cách sử dụng Override

Hãy xem cách sử dụng Override thông qua mã nguồn mẫu.

// Lớp cha
class ClassSuper {
    protected int i1 = 3;
    protected int i2 = 5;

    public void calc(){
        System.out.println("i1 + i2 = " + (i1 + i2));
    }
}
// Lớp con
class ClassSub extends ClassSuper{
    @Override
    public void calc(){
        System.out.println("i1 * i2 = " + (i1 * i2)); // Thay đổi xử lý
    }
}

public class Main {

    public static void main(String[] args) {
        ClassSub cs = new ClassSub();
        cs.calc();
    }

}

Kết quả chạy:

i1 * i2 = 15

Trong ví dụ này, lớp ClassSub kế thừa từ lớp ClassSuper. Phương thức calc của lớp ClassSuper được Override trong lớp ClassSub để thay đổi xử lý.

Chú ý rằng trước khi định nghĩa lại phương thức calc trong lớp con, ta cần sử dụng “@Override”. Mặc dù đã được chú thích, đây là một loại chú thích được gọi là “Annotation”. Chúng ta sẽ giải thích về Annotation sau.

Cách sử dụng super

Bằng cách sử dụng từ khóa “super”, bạn có thể sử dụng phương thức của lớp cha ngay cả khi nó đã được Override trong lớp con. Hãy xem một ví dụ thực tế.

// Lớp cha
class ClassSuper {
    protected int i1;
    protected int i2;

    public ClassSuper(int i1, int i2){
        this.i1 = i1;
        this.i2 = i2;
    }

    public void calc(){
        System.out.println("i1 + i2 = " + (i1 + i2));
    }
}
// Lớp con
class ClassSub extends ClassSuper{
    public ClassSub(int i1, int i2) {
        super(i1, i2);
    }

    @Override
    public void calc(){
        System.out.println

("i1 * i2 = " + (i1 * i2)); // Thay đổi xử lý
        super.calc(); // Sử dụng phương thức giống như ở lớp cha
    }
}

public class Main {

    public static void main(String[] args) {
        ClassSub cs = new ClassSub(3, 5);
        cs.calc();
    }

}

Kết quả chạy:

i1 * i2 = 15
i1 + i2 = 8

Trong ví dụ này, lớp ClassSub kế thừa từ lớp ClassSuper và Override phương thức calc để thay đổi xử lý. Sau đó, ta sử dụng từ khóa “super” để gọi lại phương thức calc của lớp cha, kết quả là phương thức của lớp cha vẫn được thực hiện nguyên vẹn.

Bằng cách sử dụng “super”, bạn có thể sử dụng phương thức của lớp cha mà không cần thay đổi ngay cả khi phương thức đã được Override.

Quy tắc khi sử dụng

Với triết lý “Tái sử dụng lớp cha trong khi vẫn có thể tự do thay đổi phương thức”, Override là một công cụ tiện ích, nhưng có một số quy tắc bạn phải tuân thủ khi sử dụng nó. Hãy mô tả chi tiết.

Về kiểu giá trị trả về và tham số

Như đã đề cập trước đó, Override yêu cầu tên phương thức giống nhau và số lượng tham số cũng như thứ tự giống nhau. Ngoài ra, kiểu giá trị trả về của phương thức cũng phải giống nhau.

@Override (Annotation)

Trong mã nguồn mẫu đã giới thiệu, trước khi định nghĩa lại phương thức trong lớp con, ta cần sử dụng “@Override”. Mặc dù đã chú thích, đây là một loại chú thích được gọi là “Annotation”. Chúng ta sẽ giải thích về Annotation sau.

Về từ khóa private

Phương thức Override trong lớp con không thể có mức truy cập nghiêm ngặt hơn so với mức truy cập của phương thức trong lớp cha. Ví dụ, nếu phương thức trong lớp cha được xác định với từ khóa protected, thì phương thức trong lớp con không thể sử dụng từ khóa private.

Xin hãy Lưu ý điều này.!

Về từ khóa final

Nếu phương thức trong lớp cha có từ khóa final, thì phương thức đó không thể được Override trong lớp con. Về cách sử dụng từ khóa final, bạn có thể tìm hiểu thêm chi tiết ở đây.

Về chỉ định lớp ngoại lệ thông qua throws

Khi phương thức của lớp cha sử dụng từ khóa throws để ném ngoại lệ, việc Override phương thức trong lớp con cũng cần chú ý. Trong trường hợp này, phương thức trong lớp con không thể chỉ định lớp ngoại lệ khác với lớp ngoại lệ đã được chỉ định trong phương thức của lớp cha.

Tóm lại

Ở đây, chúng ta đã giải thích về cách sử dụng Override và cách sử dụng từ khóa super.

Nhờ kế thừa và sử dụng Override, bạn có thể dễ dàng thay đổi xử lý sau này. Ngoài ra, việc sử dụng từ khóa “super” cũng giúp bạn sử dụng phương thức của lớp cha mà không cần thay đổi nó. Tuy nhiên, hãy chú ý rằng có một số quy tắc cần tuân thủ khi sử dụng nó.

Để hiểu rõ hơn và sử dụng hiệu quả, hãy tham khảo bài viết này nhiều lần nhé!

dev_pro_it
Đang làm IT tại Japan

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic