Ở bài trước mình có nói đến vấn đề ghi đè phương thức khi kế thừa và bài này mình sẽ nói sâu hơn về vấn đề này cho mọi người cùng tìm hiểu.
1. Ghi đè phương thức.
Ghi đè phương thức là việc chúng ta khai báo lại một phương thức đã được khai báo trong class cha với điều kiện kiểu dữ liệu trả về và các tham số là giống nhau.
Khi một phương thức đã được ghi đè thì Java sẽ ưu tiên thực thi phương thức đã được ghi đè khi chúng ta khởi tạo object từ class con.
Khi chúng ta thực hiện ghi đè phương thức thì nên thêm annotation @Override
vào trước method cần ghi đè để báo cho trình biên dịch biết và thực hiện bắn ra error nếu như phương thức bị ghi đè không tồn tại.
VD: Ghi đè phương thức printClass
.
- class Xe.java
public class Xe {
public void printClass() {
System.out.println("Day la class Xe");
}
}
- class XeDap.java
public class XeDap extends Xe {
@Override
public void printClass() {
System.out.println("Day la class XeDap");
}
}
- class Main.java
public class Main {
public static void main(String[] args) {
XeDap xe = new XeDap();
xe.printClass();
}
}
Kết quả:
Day la class XeDap
Trong ví dụ trên nếu như bạn xóa @Override
đi và bỏ method printClass() trong class Xe đi thì đoạn code trên vẫn hoạt động. Nhưng nếu bạn giữ nguyên annotation @Override
và bỏ method printClass()
trong class Xe đi thì trình biên dịch sẽ báo lỗi như sau:
error: method does not override or implement a method from a supertype
Chính vì thế các bạn nên thêm annotation cho code có tính chặt chẽ vào IDE support cũng ngon hơn.
2. Che giấu phương thức.
Che giấu phương thức là việc khai báo lại phương thức static trong hai class kế thừa nhau với kiểu dữ liệu trả về và tham số truyền vào tương tự nhau.
VD:
- class Xe.java
public class Xe {
public static void printClassStatic() {
System.out.println("Static. Day la class Xe");
}
}
- class XeDap.java
public class XeDap extends Xe {
public static void printClassStatic() {
System.out.println("Static. Day la class XeDap");
}
}
- class Main.java
public class Main {
public static void main(String[] args) {
Xe.printClassStatic();
XeDap.printClassStatic();
}
}
Kết quả:
Static. Day la class Xe
Static. Day la class XeDap
3. Ghi đề với che giấu phương thức.
Chắc đọc đến đây các bạn cũng đang mông lung chưa biết được sự khác nhau giữa việc ghi đè với che giấu phương thức nó là như nào. Thì đây là một số điểm khác nhau:
- Phương thức ghi đè chỉ được gọi ở lớp con.
- Phương thức che giấu sẽ được gọi phụ thuộc vào việc chúng ta gọi nó từ đâu.
Để cho dễ hiểu hơn thì các bạn tham khảo ví dụ sau.
VD:
- class Xe.java
public class Xe {
public static void printClassStatic() {
System.out.println("Static. Day la class Xe");
}
public void printClass() {
System.out.println("Day la class Xe");
}
}
- class XeDap.java
public class XeDap extends Xe {
public static void printClassStatic() {
System.out.println("Static. Day la class XeDap");
}
public void printClass() {
System.out.println("Day la class XeDap");
}
}
- class Main.java
public class Main {
public static void main(String[] args) {
XeDap xeDap = new XeDap();
Xe xe = xeDap;
xe.printClass();
xe.printClassStatic();
}
}
Kết quả:
Day la class XeDap
Static. Day la class Xe
Như các bạn đã thấy, việc gọi phương thức static
chính là việc gọi phương thức của class nên trong trường hợp này Java sẽ gọi phương thức printClassStatic()
của class Xe
(do chúng ta đã gán lại xe = xeDap
). Còn việc gọi phương thức thường chính là gọi phương thức của đối tượng nên trong trường hợp trên phương thức printClass()
được thực thi là của đối tượng xeDap
.
4. Lời kết.
Phần này tương đối quan trọng nên các bạn cần phải nắm kĩ cách nó xử lí như thế nào để sau này không mắc phải những lỗi cơ bản.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments