Trang chủHướng dẫnHiểu rõ Abstract Class trong Java
Java

Hiểu rõ Abstract Class trong Java

CyStack blog 5 phút để đọc
CyStack blog04/06/2025
Reading Time: 5 minutes

Mở đầu

Trong lập trình hướng đối tượng với Java, abstract class (lớp trừu tượng) là một khái niệm quan trọng và thường gặp, đặc biệt khi thiết kế các hệ thống theo kiến trúc kế thừa. Lớp trừu tượng giống như một bản thiết kế chung cho các lớp con nhưng khác với interface, nó có thể chứa cả các phương thức trừu tượng (phương thức chỉ có phần khai báo) và các phương thức đã được triển khai sẵn.

Abstract Class trong Java

Một lớp được khai báo là abstract không thể được khởi tạo trực tiếp bạn không thể tạo instance từ abstract class. Thay vào đó, nó được thiết kế để các lớp con kế thừa và cung cấp triển khai cụ thể cho các phương thức trừu tượng. Đồng thời, các lớp con cũng có thể sử dụng lại những phương thức đã được định nghĩa sẵn trong lớp trừu tượng.

Từ khóa abstract trong Java được dùng để khai báo cả lớp và phương thức trừu tượng. Khi một lớp có ít nhất một phương thức trừu tượng, bắt buộc lớp đó cũng phải được khai báo là abstract.

Sử dụng abstract class là một kỹ thuật thường được áp dụng để:

  • Định nghĩa một API hoặc hợp đồng cơ bản cho các lớp con.
  • Tái sử dụng mã nguồn chung giữa các lớp có liên quan.
  • Cung cấp một khung (framework) mở mà lập trình viên có thể mở rộng theo cách riêng của mình.

Ví dụ thực tế

Sau đây là một ví dụ đơn giản về Lớp trừu tượng trong Java.

package com.journaldev.design;

//abstract class
public abstract class Person {
	
	private String name;
	private String gender;
	
	public Person(String nm, String gen){
		this.name=nm;
		this.gender=gen;
	}
	
	//abstract method
	public abstract void work();
	
	@Override
	public String toString(){
		return "Name="+this.name+"::Gender="+this.gender;
	}

	public void changeName(String newName) {
		this.name = newName;
	}	
}
  • Lớp Person được khai báo là abstract, nên không thể tạo đối tượng trực tiếp từ lớp này.
  • Phương thức work() là một phương thức trừu tượng chỉ có phần khai báo, không có thân. Bất kỳ lớp nào kế thừa từ Person bắt buộc phải override phương thức này để định nghĩa công việc cụ thể.
  • Phương thức changeName()toString() là các phương thức đã triển khai sẵn (concrete methods). Các lớp con có thể sử dụng lại mà không cần viết lại, hoặc override nếu muốn thay đổi hành vi.
  • Constructor Person(String nm, String gen) cho thấy abstract class vẫn có thể có constructor để khởi tạo các thuộc tính chung cho lớp con.

Tiếp theo đây là ví dụ về lớp cụ thể sử dụng lớp trừu tượng trong Java.

package com.journaldev.design;

public class Employee extends Person {
	
	private int empId;
	
	public Employee(String nm, String gen, int id) {
		super(nm, gen);
		this.empId=id;
	}

	@Override
	public void work() {
		if(empId == 0){
			System.out.println("Not working");
		}else{
			System.out.println("Working as employee!!");
		}
	}
	
	public static void main(String args[]){
		//coding in terms of abstract classes
		Person student = new Employee("Dove","Female",0);
		Person employee = new Employee("Pankaj","Male",123);
		student.work();
		employee.work();
		//using method implemented in abstract class - inheritance
		employee.changeName("Pankaj Kumar");
		System.out.println(employee.toString());
	}

}
  • Lớp Employee kế thừa từ lớp trừu tượng Person và hiện thực sử dụng phương thức work() theo logic riêng là nếu empId = 0 ==> nhân viên không làm việc và ngược lại.
  • Trong phương thức main, bạn thấy một kỹ thuật rất phổ biến là code “dựa trên kiểu abstract” thay vì kiểu cụ thể (Person student = new Employee(...)).
  • Gọi employee.changeName(...) cho thấy abstract class có thể chứa logic tái sử dụng, rất hữu ích khi nhiều lớp con cần dùng chung.
  • Cuối cùng, toString() là phương thức override sẵn trong abstract class, giúp định dạng thông tin rõ ràng khi in đối tượng.

Như bạn đã thấy qua ví dụ với lớp Person và lớp con Employee, abstract class trong Java là một công cụ mạnh mẽ để thiết kế các lớp cơ sở có thể định nghĩa hành vi dùng chung và ép buộc các lớp con phải cài đặt các hành vi cụ thể. Đây là một phần quan trọng trong tư duy lập trình hướng đối tượng và thường được sử dụng trong các kiến trúc phần mềm quy mô lớn. Tuy nhiên, để sử dụng abstract class một cách hiệu quả và tránh nhầm lẫn với interface, bạn cần nắm rõ một số quy tắc và đặc điểm kỹ thuật quan trọng mà Java quy định đối với abstract class.

Những điểm quan trọng về Abstract Class trong Java

Dưới đây là tổng hợp các đặc điểm và quy tắc quan trọng mà bạn cần nắm rõ khi làm việc với abstract class trong Java:

  1. Từ khóa abstract được sử dụng để khai báo một lớp trừu tượng trong Java.
  2. Abstract class không thể được khởi tạo, bạn không thể tạo đối tượng trực tiếp từ một lớp trừu tượng.
  3. Bạn có thể dùng abstract để khai báo phương thức trừu tượng đây là phương thức không có phần thân, chỉ có phần khai báo.
  4. Nếu một lớp chứa ít nhất một phương thức trừu tượng, thì bản thân lớp đó cũng phải được khai báo là abstract, nếu không chương trình sẽ không biên dịch được.
  5. Không bắt buộc abstract class phải có phương thức trừu tượng. Bạn hoàn toàn có thể khai báo một lớp là abstract chỉ để ngăn việc khởi tạo trực tiếp, hoặc cung cấp logic dùng chung cho các lớp con.
  6. Nếu một abstract class không chứa bất kỳ phần cài đặt nào, tức là chỉ khai báo phương thức mà không triển khai, thì sử dụng interface sẽ hợp lý hơn vì Java không hỗ trợ kế thừa đa lớp (multiple inheritance) nhưng lại hỗ trợ implement nhiều interface.
  7. Lớp con kế thừa từ abstract class bắt buộc phải override tất cả các phương thức trừu tượng, trừ khi lớp con đó cũng được khai báo là abstract.
  8. Trong interface, tất cả các phương thức mặc định là abstract (trừ khi được khai báo là static hoặc default). Từ Java 8, interface đã hỗ trợ phương thức defaultstatic, giúp linh hoạt hơn trong thiết kế.
  9. Một abstract class có thể implement một hoặc nhiều interface, mà không cần phải cài đặt tất cả các phương thức của interface đó. Việc triển khai có thể để dành cho các lớp con.
  10. Abstract class thường được dùng để:
    • Cung cấp phần triển khai mặc định cho các lớp con.
    • Tái sử dụng logic dùng chung (như helper method, default behavior).
    • Xây dựng cấu trúc kế thừa rõ ràng trong hệ thống.
  11. Một abstract class hoàn toàn có thể có phương thức main() và chạy như một lớp bình thường, miễn là bạn không cố tạo instance của nó trực tiếp.

Tổng kết

Abstract class là một trong những công cụ cực kỳ hữu ích giúp bạn tổ chức và tái sử dụng code trong Java. Qua bài viết này, hy vọng bạn đã hiểu rõ hơn về cách hoạt động của abstract class, từ khái niệm đến cách khai báo, kế thừa và triển khai các phương thức trừu tượng. Việc sử dụng abstract class đúng cách không chỉ giúp mã nguồn của bạn trở nên gọn gàng, dễ bảo trì mà còn tạo tiền đề vững chắc cho những thiết kế hướng đối tượng chuyên nghiệp hơn. Đừng quên rằng abstract class cũng rất linh hoạt khi kết hợp với interface, đặc biệt trong những dự án lớn đòi hỏi sự mở rộng và bảo trì lâu dài. Nếu bạn đang trên hành trình trở thành một lập trình viên Java chuyên nghiệp, nắm vững abstract class là bước không thể bỏ qua. Hãy thử áp dụng kiến thức này vào dự án thực tế của bạn và trải nghiệm sự khác biệt.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.