Abstract Class (Lớp trừu tượng) là gì? Abstract Method (Phương thức trừu tượng) trong là gì? Các ví dụ minh họa trong Java.
Trong bài viết này chúng ta sẽ đi tìm hiểu về Abstract Class và Abstract Method trong Java, cách sử dụng và các ví dụ minh họa.
1. Lớp trừu tượng (Abstract Class) trong Java
- Một lớp được khai báo với từ khóa abstract là lớp trừu tượng (abstract class).
- Lớp trừu tượng có thể có các phương thức abstract hoặc non-abstract.
- Lớp trừu tượng có thể khai báo 0, 1 hoặc nhiều method trừu tượng bên trong.
- Không thể khởi tạo 1 đối tượng trực tiếp từ một lớp trừu tượng.
Một lớp kế thừa từ lớp trừu tượng (subclass – lớp con) không cần phải implement non-abstract methods, nhưng những phương thức abstract trong lớp cha thì lớp con bắt buộc phải override. Trừ khi subclass cũng là abstract.
Cú pháp:
<PhamViTruyCap> abstract class <TenLop> {
}
2. Phương thức trừu tượng trong Java
- Một phương thức được khai báo là abstract và không có trình triển khai thì đó là phương thức trừu tượng (abstract method).
- Nếu bạn muốn một lớp chứa một phương thức cụ thể nhưng bạn muốn triển khai thực sự phương thức đó để được quyết định bởi các lớp con, thì bạn có thể khai báo phương thức đó trong lớp cha ở dạng abstract.
- Từ khóa abstract được sử dụng để khai báo một phương thức dạng abstract. Phương thức abstract sẽ không có định nghĩa, được theo sau bởi dấu chấm phẩy, không có dấu ngoặc nhọn theo sau.
Cú pháp:
<PhamViTruyCap> abstract void <TenPhuongThuc>();
3. Ví dụ về lớp trừu tượng và phương thức trừu tượng
Ví dụ: Viết chương trình vẽ một hình bất kỳ với màu đỏ, sao cho cách sử dụng là giống nhau, bất kể đó là hình gì. Hình đó có thể là hình chữ nhật (rectangle), hình tròn (circle), tam giác (triangle), đường (line), …
Với yêu cầu trên, ta tạo một lớp trừu tượng Shape. Lớp này cung cấp một phương thức trừu tượng draw, phương thức này để đảm bảo rằng tất cả các hình đều có cùng cách sử dụng (draw). Ngoài ra, có phương thức không trừu tượng getColor để cung cấp màu sử dụng chung cho tất cả các hình. Tiếp theo, ta tạo 2 lớp Rectangle và Circle kế thừa từ lớp Shape, 2 lớp này có những cách xử lý draw khác nhau. Cuối cùng, ta tạo class ShapeApp, gọi phương thức draw để vẽ hình theo yêu cầu.
Shape.java
public abstract class Shape {
private String color = "red";
public Shape() {
}
public abstract void draw();
public String getColor() {
return color;
}
}
Rectangle.java
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Draw " + super.getColor() + " rectangle");
}
}
Circle.java
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Draw " + super.getColor() + " circle");
}
}
ShapeApp.java
public class ShapeApp {
public static void main(String[] args) {
Shape rect = new Rectangle();
rect.draw();
System.out.println("---");
Shape circle = new Circle();
circle.draw();
}
}
Kết quả:
Draw red rectangle
---
Draw red circle
4. Một vài lưu ý
Lớp con bắt buộc phải cài đặt (implement) tất cả các phương thức trừu tượng của lớp cha
Bạn nhận được thông báo lỗi nếu lớp con không cài đặt (implement) tất cả các phương thức trừu tượng của lớp cha: The type Triangle must implement the inherited abstract method Shape.draw().
Không thể khởi tạo trực tiếp một lớp trừu tượng
Bạn nhận được thông báo lỗi khi cố tình khởi tạo một lớp trừu tượng: Cannot instantiate the type Shape.
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!