Tính đa hình trong Java: Cách nạp chồng hoặc ghi đè các phương thức
20/06/2023 15:04
Tính đa hình trong Java: Cách nạp chồng hoặc ghi đè các phương thức. Nạp chồng và ghi đè phương thức là hai cách mà Java thể hiện tính đa hình. TÌm hiểu cụ thể ngay trong bài viết dưới đây!
Nạp chồng và ghi đè phương thức là hai cách mà Java thể hiện tính đa hình. Tính đa hình xuất phát từ sự kết hợp của hai từ Hy Lạp: "poly" nghĩa là nhiều và "morph" nghĩa là hình thức. Do đó, tính đa hình cho phép các phương thức có nhiều dạng.
Thực hiện theo hướng dẫn này để tìm hiểu cách nạp chồng hoặc ghi đè các phương thức trong Java.
Quá tải phương thức là gì?
"Nạp chồng phương thức" đề cập đến việc định nghĩa các phương thức khác nhau trong một lớp có cùng tên. Các phương pháp phải có chữ ký khác nhau. Chữ ký phương thức là sự kết hợp của tên phương thức và danh sách tham số. Nó không bao gồm kiểu trả về.
Trình biên dịch biết nên sử dụng phương thức nào bằng cách kiểm tra loại, số lượng tham số và thứ tự chúng được đặt.
Quá tải phương thức thể hiện tính đa hình thời gian biên dịch. Tính đa hình thời gian biên dịch có nghĩa là trình biên dịch Java liên kết một đối tượng với chức năng của nó khi chạy. Trình biên dịch kiểm tra chữ ký của phương thức để đạt được điều này.
Loại đa hình này còn được gọi là liên kết tĩnh hoặc sớm.
Xem ví dụ nạp chồng phương thức bên dưới:
class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println("The cube of 5 is " + myMultiplication.cube(5));
System.out.println("The cube of 5.0 is " + myMultiplication.cube(5.0));
System.out.println("The cube of 0.5 is " + myMultiplication.cube(0.5));
}
}
Đầu ra:
The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125
Đoạn mã trên cho thấy cách bạn có thể nhận được một khối có nhiều loại khác nhau ( int , double , float ) bằng cùng một phương pháp.
Nói chung, nạp chồng phương thức được sử dụng để xác định các phương thức tương tự với các loại tham số khác nhau.
Ghi đè phương thức là gì?
Điều này đề cập đến một triển khai khác của một phương thức trong một lớp con. Phương thức này phải được định nghĩa sẵn trong lớp cha.
Phương thức ghi đè (nghĩa là phương thức trong lớp con) phải có cùng chữ ký phương thức như trong lớp cha. Kiểu trả về của phương thức ghi đè có thể giống hoặc kiểu con của phương thức trong siêu lớp.
Ghi đè thường được sử dụng để bao gồm việc triển khai cụ thể hành vi của một đối tượng trong lớp con.
class Account{
public void message() {
System.out.println("\nThank you for opening an account with us!");
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println("\nThank you for opening a Savings account with us!");
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println("\nThank you for opening a Fixed Deposit account with us!");
}
}
Đầu ra:
Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!
Ví dụ trên cho thấy phương thức message() được ghi đè như thế nào trong các lớp con Savings và FixedDeposit . Các thông báo khác nhau sẽ được hiển thị cho chủ tài khoản ngân hàng có tài khoản Tiết kiệm và những người có tài khoản Tiền gửi cố định.
Cũng cần lưu ý rằng việc ghi đè phương thức thể hiện tính đa hình thời gian chạy hoặc gửi phương thức động. Điều này có nghĩa là phương thức được gọi được giải quyết trong thời gian chạy thay vì khi biên dịch.
Để tránh một phương thức bị ghi đè, hãy sử dụng từ khóa cuối cùng .
final void message (){
System.out.println("\nThank you for opening an account with us!");
}
Khi một lớp con cố gắng ghi đè lên nó, một lỗi biên dịch sẽ xảy ra.
Lý tưởng nhất là tất cả các phương thức được gọi trong hàm tạo phải là phương thức cuối cùng . Điều này là để tránh mọi thay đổi ngoài ý muốn có thể gây ra bởi các lớp con.
Đôi khi, bạn có thể cần truy cập một phương thức được ghi đè bên trong phương thức được ghi đè. Bạn có thể sử dụng từ khóa super theo sau là toán tử dấu chấm ( . ) và tên phương thức trong trường hợp như vậy.
Hãy xem xét siêu lớp Animal .
class Animal{
public void move() {
System.out.println("\nI can move.");
}
}
Dưới đây là một lớp con, được gọi là Fish , ghi đè move() :
class Fish extends Animal {
public void move() {
System.out.println("\nI can swim.");
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}
Đầu ra:
I can swim.
I can move.
Khi ghi đè một phương thức, bạn cũng cần lưu ý đến công cụ sửa đổi truy cập được sử dụng. Công cụ sửa đổi trong lớp con phải có cùng mức độ hiển thị hoặc cao hơn trong lớp cơ sở. Ví dụ: nếu phương thức trong lớp cơ sở được định nghĩa là protected thì phương thức ghi đè có thể là protected hoặc public .
Mã đơn giản với đa hình
Ghi đè và nạp chồng phương thức rất quan trọng để đơn giản hóa mã và mã đơn giản là cách thực hành tốt.
Tại sao? Hãy tưởng tượng một cơ sở mã phức tạp với nhiều thông tin chi tiết hơn so với Grand Central Station. Bây giờ hãy tưởng tượng một con bọ tàn phá bắt đầu phá hủy công việc khó khăn của bạn ngay trước mắt bạn. Bạn cần phải cách ly nguồn lây nhiễm, và bạn cần phải làm điều đó một cách nhanh chóng.
>>> Tham khảo ngay khóa học Java tại đây