Email Doanh NghiệpSSLFirewall Anti DDoS

NỘI DUNG

Banner blog lễ 30.4 và 1.5

Abstract class là gì? So sánh abstract class và interface chi tiết

Hưng Nguyễn

Đã kiểm duyệt nội dung

Ngày đăng:04/03/2026
Lượt xem

Quy trình sản xuất nội dung

Đánh giá

[esi kkstarratings cache="private" ttl="3"]
Speed optimizer 2

Abstract class là một lớp trừu tượng dùng làm nền tảng cho các lớp khác kế thừa và không được khởi tạo trực tiếp. Trong bài viết này, mình sẽ cùng bạn tìm hiểu rõ hơn về abstract class, từ đặc điểm nổi bật, cách hoạt động trong Java/PHP/C#, sự khác nhau với interface và cách lựa chọn cho từng tình huống thực tế.

Những điểm chính

  • Khái niệm và ví dụ: Hiểu rõ Abstract class là một lớp trừu tượng dùng làm lớp cơ sở, giúp bạn nhận biết vai trò của nó trong việc định nghĩa một bộ khung chung cho các lớp con.
  • Đặc điểm: Nắm vững các đặc điểm cốt lõi như không thể khởi tạo trực tiếp và bắt buộc lớp con phải triển khai các phương thức trừu tượng, giúp bạn sử dụng abstract class một cách chính xác.
  • Ứng dụng trong các ngôn ngữ phổ biến: Tìm hiểu cách abstract class được triển khai trong Java, PHP và C#, giúp bạn áp dụng vào các dự án thực tế với từng ngôn ngữ cụ thể.
  • So sánh với Interface: Phân biệt rõ ràng sự khác biệt về đa kế thừa, constructor và các loại thành viên, giúp bạn lựa chọn đúng công cụ trừu tượng hóa phù hợp với từng kịch bản thiết kế.
  • Tiêu chí lựa chọn: Nắm vững các trường hợp nên sử dụng abstract class và khi nào nên dùng interface, giúp bạn đưa ra quyết định kiến trúc sáng suốt để xây dựng hệ thống linh hoạt và dễ bảo trì.
  • Giới thiệu Vietnix: Biết đến Vietnix là nhà cung cấp hạ tầng uy tín, giúp bạn có một nền tảng đáng tin cậy để triển khai các ứng dụng OOP của mình.
  • Câu hỏi thường gặp: Được giải đáp các thắc mắc phổ biến liên quan đến abstract class.
những điểm chính

Abstract class là gì?

Abstract class là một lớp trừu tượng trong lập trình hướng đối tượng, được dùng để làm lớp cơ sở và không thể tạo đối tượng trực tiếp từ lớp đó. Lớp này thường chứa cả phương thức trừu tượng (method không có phần thân, chỉ khai báo) và phương thức cụ thể (method đã có sẵn phần xử lý), buộc các lớp con phải override những phương thức trừu tượng khi kế thừa. Nhờ đó, abstract class giúp định nghĩa một bộ khung chung cho nhóm lớp có liên quan, vừa tái sử dụng được logic chung, vừa ép buộc các lớp con triển khai chi tiết theo nhu cầu riêng.

Abstract class là một lớp trừu tượng trong lập trình hướng đối tượng
Abstract class là một lớp trừu tượng trong lập trình hướng đối tượng

Ví dụ đơn giản với Java:

// Lớp trừu tượng
abstract class Shape {
    // Phương thức trừu tượng: không có thân
    public abstract double area();

    // Phương thức cụ thể: đã có triển khai
    public void printArea() {
        System.out.println("Area = " + area());
    }
}

// Lớp con kế thừa và bắt buộc triển khai area()
class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }
}

// Hàm main minh họa
public class Main {
    public static void main(String[] args) {
        Shape rect = new Rectangle(5, 10);
        rect.printArea(); // In ra: Area = 50.0
    }
}

Trong đó:

  • Shape: Định nghĩa khung chung cho các hình học, trong đó area() là phương thức trừu tượng và printArea() là phương thức đã có sẵn phần triển khai.
  • Rectangle: Bắt buộc phải tự triển khai logic tính diện tích trong area(), sau đó có thể gọi lại printArea() kế thừa từ lớp cha để in ra kết quả.

Cũng giống như việc xây dựng một cấu trúc code vững chắc, việc triển khai ứng dụng của bạn cũng cần một nền tảng hạ tầng mạnh mẽ. Để đảm bảo ứng dụng hoạt động mượt mà và ổn định, bạn có thể tham khảo các gói VPS tốc độ cao của Vietnix.

Đặc điểm của abstract class

Abstract class có một số đặc điểm quan trọng mà bạn cần nắm rõ trước khi sử dụng trong thiết kế hướng đối tượng, cụ thể gồm:

  • Không thể khởi tạo trực tiếp: Abstract class không cho phép tạo đối tượng bằng toán tử new, bạn chỉ có thể khởi tạo thông qua các lớp con kế thừa abstract class.
  • Có thể chứa cả abstract method và concrete method: Bên trong abstract class, bạn có thể khai báo phương thức trừu tượng (chỉ khai báo, không có thân) và phương thức đã triển khai để tái sử dụng logic chung cho mọi lớp con.
  • Lớp con phải triển khai các abstract method: Mọi lớp con không phải abstract khi kế thừa abstract class đều bắt buộc override toàn bộ phương thức trừu tượng, nếu không thì lớp con cũng phải được đánh dấu abstract.
  • Có thể có constructor, thuộc tính, static và final method: Abstract class hỗ trợ đầy đủ các thành phần như một lớp thường, giúp bạn vừa định nghĩa trạng thái (field) chung, vừa cung cấp hàm tiện ích và logic khởi tạo cho các lớp con.
  • Thường dùng làm lớp cơ sở trong hệ phân cấp: Abstract class đại diện cho một khái niệm chung trong domain (ví dụ Shape, Animal, PaymentMethod), cho phép xây dựng cây kế thừa rõ ràng và buộc các lớp con tuân thủ một tập giao diện tối thiểu.
Abstract class thường dùng làm lớp cơ sở trong hệ phân cấp
Abstract class thường dùng làm lớp cơ sở trong hệ phân cấp (Nguồn: Internet)

Abstract class trong Java

Trong Java, abstract class được khai báo bằng từ khóa abstract và dùng làm lớp cha trong hệ phân cấp kế thừa. Abstract class trong Java có thể chứa cả abstract method và concrete method, cho phép vừa định nghĩa khung giao diện bắt buộc, vừa cung cấp sẵn một phần logic dùng chung cho các lớp con.

Lớp con không phải abstract khi kế thừa abstract class phải triển khai toàn bộ phương thức trừu tượng, nếu không thì lớp con cũng phải được đánh dấu abstract để tránh lỗi biên dịch. Ngoài ra, abstract class trong Java có thể có constructor, field, phương thức static, final và phù hợp cho các trường hợp cần chia sẻ trạng thái hoặc hành vi chung giữa nhiều lớp liên quan.

Abstract class trong Java
Abstract class trong Java (Nguồn: Internet)

Abstract class trong PHP

Trong PHP, abstract class được định nghĩa bằng từ khóa abstract và phải chứa ít nhất một abstract method (phương thức chỉ khai báo, không có thân). Mục tiêu chính là buộc mọi lớp con kế thừa phải triển khai các phương thức trừu tượng, từ đó đảm bảo tất cả lớp con tuân theo một cấu trúc tối thiểu do lớp cha quy định.

Abstract class trong PHP vẫn có thể chứa phương thức thông thường, thuộc tính, constructor và cho phép chia sẻ code chung giữa các lớp con thông qua kế thừa. Khi thiết kế hệ thống PHP hướng đối tượng, abstract class thường được dùng cho các khái niệm chung như BaseController, Repository, Service, giúp chuẩn hóa giao diện làm việc giữa các phần trong ứng dụng.

Abstract class trong C#

Trong C#, abstract class cũng được khai báo bằng từ khóa abstract và dùng làm lớp cơ sở không thể khởi tạo trực tiếp. Abstract class trong C# có thể chứa cả phương thức trừu tượng lẫn phương thức đã triển khai, cho phép định nghĩa sẵn hành vi mặc định và buộc lớp con ghi đè khi cần.

Abstract class trong C# được phép có constructor, destructor, thuộc tính, sự kiện và phương thức tĩnh, nên phù hợp cho các trường hợp cần chia sẻ trạng thái và logic chung. Lớp con phải triển khai toàn bộ phương thức abstract, nếu không thì bản thân lớp con cũng phải được đánh dấu abstract. C# không hỗ trợ đa kế thừa abstract class mà chỉ hỗ trợ đa kế thừa interface, tuy nhiên abstract class vẫn có thể khai báo phương thức virtual để lớp con override linh hoạt theo nhu cầu.

Abstract class trong C#
Abstract class trong C# (Nguồn: Internet)

So sánh abstract class và interface

Trong lập trình Java, abstract class và interface đều hỗ trợ trừu tượng hóa, cùng cho phép định nghĩa phương thức trừu tượng để ép lớp con tuân theo một hợp đồng chung. Abstract class phù hợp khi cần chia sẻ trạng thái và logic chung trong một cây kế thừa, trong khi interface phù hợp khi cần một bộ khung hành vi mà nhiều lớp khác nhau có thể triển khai, kể cả khi không liên quan về mặt kế thừa. Bảng dưới đây tổng hợp các điểm khác nhau quan trọng giữa abstract class và interface trong Java để bạn dễ đối chiếu khi thiết kế:

Tiêu chíAbstract classInterface
Cách khai báoKhai báo với từ khóa abstract classKhai báo với từ khóa interface
Số lượng cha trên một lớpMột lớp chỉ extends một abstract classMột lớp có thể implements nhiều interface
Đa kế thừaKhông hỗ trợ đa kế thừa giữa các classHỗ trợ “đa kế thừa hành vi” thông qua việc implements nhiều interface
ConstructorCó thể định nghĩa constructorKhông có constructor
Kiểu phương thứcCó abstract method và method có thânCó abstract, default, static, private method (tùy phiên bản Java)
FieldCó thể có instance field, static field, final hoặc non-finalMọi field đều là public static final (hằng số)
Access modifier cho methodCho phép public, protected, privateChủ yếu public, từ Java 9+ thêm private cho method dùng nội bộ
Mức độ trừu tượngKhông bắt buộc trừu tượng 100%, có thể trộn logic cụ thể và logic trừu tượngBan đầu trừu tượng gần 100%, sau này thêm default/static/private method có triển khai
Kế thừa nội bộCó thể extends một class khác (abstract hoặc concrete)Có thể extends một hoặc nhiều interface khác
Quan hệ với nhauAbstract class có thể implements một hoặc nhiều interfaceInterface không implements abstract class, chỉ được class hoặc abstract class implements
Trường hợp sử dụng điển hìnhDùng khi cần chia sẻ trạng thái và một phần logic chung giữa các lớp cùng nhánh kế thừaDùng khi cần một bộ hành vi chuẩn để nhiều lớp cùng tuân theo, kể cả lớp không cùng nhánh kế thừa

Trường hợp nên sử dụng abstract class

Khi thiết kế hệ thống hướng đối tượng, abstract class phù hợp cho các nhóm lớp có quan hệ gần nhau và cần chia sẻ cả trạng thái lẫn hành vi chung. Bạn có thể ưu tiên abstract class trong các tình huống sau:

  • Các lớp con có chung dữ liệu và logic: Dùng abstract class khi nhiều lớp cần dùng chung field, constructor và một số phương thức đã triển khai, ví dụ các lớp Car, Truck kế thừa Vehicle với thuộc tính speed, weight dùng chung.
  • Cần cung cấp triển khai mặc định nhưng cho phép override: Khi một số hành vi nên có bản mặc định nhưng lớp con vẫn có quyền thay đổi, abstract class cho phép vừa viết sẵn method, vừa khai báo abstract method để lớp con bắt buộc hoàn thiện phần còn lại.
  • Cần kiểm soát chặt chẽ hệ phân cấp: Khi muốn xây dựng một cây kế thừa với luồng mở rộng rõ ràng, chỉ cho phép kế thừa theo một nhánh xác định, abstract class giúp quản lý cấu trúc dễ hơn so với interface.
  • Cần dùng member không phải public trong hệ phân cấp: Khi cần protected field hoặc method dùng nội bộ giữa các lớp cùng nhánh kế thừa, abstract class phù hợp vì có thể lưu trữ và quản lý trạng thái chung.
Abstract class phù hợp cho các nhóm lớp có quan hệ gần nhau và cần chia sẻ cả trạng thái lẫn hành vi chung
Abstract class phù hợp cho các nhóm lớp có quan hệ gần nhau và cần chia sẻ cả trạng thái lẫn hành vi chung

Trường hợp nên sử dụng interface

Interface phù hợp khi mục tiêu chính là định nghĩa một hợp đồng hành vi mà nhiều lớp, kể cả không cùng cây kế thừa, đều phải tuân theo. Bạn nên ưu tiên interface trong các trường hợp sau:

  • Nhiều lớp không liên quan cùng cần chung một bộ hành vi: Khi các lớp khác nhau đều phải triển khai cùng một nhóm phương thức, ví dụ Loggable, Serializable, Closable, interface giúp chuẩn hóa chữ ký method cho toàn hệ thống.
  • Cần hỗ trợ đa kế thừa hành vi: Khi một lớp phải gánh nhiều vai trò cùng lúc như Runnable, Comparable, Observer, interface cho phép implements nhiều hợp đồng mà không bị giới hạn bởi quy tắc “mỗi lớp chỉ có một class cha”.
  • Muốn tách rõ hợp đồng API khỏi phần triển khai: Khi cần thiết kế API để client lập trình dựa trên interface và không phụ thuộc implementation cụ thể, interface là lựa chọn phù hợp, giúp việc thay thế hoặc mock trong unit test dễ dàng.
  • Xây dựng module linh hoạt và dễ mở rộng: Khi muốn inject nhiều implementation khác nhau cho cùng một chức năng, ví dụ nhiều loại storage hoặc nhiều nhà cung cấp thanh toán, interface giúp giảm phụ thuộc giữa các phần trong codebase.
Trường hợp nên sử dụng interface
Trường hợp nên sử dụng interface

Hạ tầng triển khai ứng dụng OOP cho abstract class và interface từ Vietnix

Khi bắt đầu áp dụng abstract class, interface và các mẫu thiết kế OOP vào dự án thực tế, bạn sẽ cần một môi trường chạy ứng dụng ổn định, dễ mở rộng. Để triển khai API Java hoặc PHP, bạn có thể tham khảo các gói VPS Vietnix với SSD NVMe, băng thông cao và tài nguyên linh hoạt, phù hợp cho cả môi trường dev, staging và production. Khi hệ thống phát triển lớn hơn, cần tài nguyên riêng biệt và hiệu năng cao hơn, dịch vụ thuê máy chủ vật lý tại Vietnix là lựa chọn nâng cấp tự nhiên cho các backend, service nội bộ hoặc hệ thống xử lý dữ liệu nặng. Đội ngũ kỹ thuật Vietnix luôn hỗ trợ bạn tối ưu cấu hình server để code OOP vận hành ổn định và tận dụng tốt tài nguyên.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh

Câu hỏi thường gặp

Abstract là gì trong code?

Trong code, từ khóa abstract thường dùng để khai báo lớp trừu tượng (abstract class) hoặc phương thức trừu tượng (abstract method) trong các ngôn ngữ hướng đối tượng như Java, C#, PHP.

Một abstract class có bắt buộc phải có abstract method không?

Không bắt buộc, abstract class có thể không chứa abstract method nhưng vẫn được khai báo là abstract để tránh tạo instance trực tiếp và chỉ dùng để kế thừa.

Có thể dùng abstract class cho enum hoặc record không?

Trong Java, enum và record có cơ chế riêng, nếu cần trừu tượng hóa cho các loại dữ liệu này thì nên cân nhắc interface hoặc pattern khác thay vì lạm dụng abstract class.

Abstract class giúp định nghĩa khung chung và chia sẻ logic giữa các lớp có quan hệ chặt chẽ, trong khi interface tập trung vào việc mô tả hợp đồng hành vi cho nhiều lớp. Khi hiểu rõ đặc điểm, điểm khác nhau và trường hợp sử dụng của từng khái niệm, bạn có thể thiết kế kiến trúc hướng đối tượng rõ ràng, dễ bảo trì và dễ mở rộng hơn cho ứng dụng của mình.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

lap-trinh

text
icon popup single post

CẢM ƠN BẠN ĐÃ ĐÁNH GIÁ BÀI VIẾT

Vietnix sẽ luôn cố gắng cải thiện chất lượng dịch vụ mỗi ngày

ĐÓNG

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG