1. Khái niệm nào sau đây là trụ cột cơ bản của lập trình hướng đối tượng, cho phép gói gọn dữ liệu và phương thức hoạt động trên dữ liệu đó vào trong một đơn vị duy nhất?
A. Tính đa hình (Polymorphism)
B. Tính đóng gói (Encapsulation)
C. Tính kế thừa (Inheritance)
D. Tính trừu tượng (Abstraction)
2. Giao diện (interface) trong OOP được sử dụng để làm gì?
A. Thay thế cho lớp trừu tượng khi cần đa kế thừa.
B. Định nghĩa một tập hợp các phương thức mà các lớp thực thi giao diện đó phải cung cấp hiện thực.
C. Tạo ra các đối tượng có khả năng tự học.
D. Tăng cường tính bảo mật bằng cách ẩn giấu toàn bộ mã nguồn.
3. Điểm khác biệt chính giữa lớp trừu tượng (abstract class) và giao diện (interface) là gì?
A. Lớp trừu tượng hỗ trợ đa kế thừa, giao diện thì không.
B. Lớp trừu tượng có thể chứa các phương thức đã được hiện thực hóa (có phần thân), còn giao diện chỉ chứa các phương thức trừu tượng.
C. Giao diện có thể có thuộc tính, lớp trừu tượng thì không.
D. Lớp trừu tượng dùng cho quan hệ `có một` (has-a), giao diện dùng cho quan hệ `là một` (is-a).
4. Ví dụ nào sau đây thể hiện rõ nhất tính đa hình (polymorphism) trong OOP?
A. Một lớp `HìnhChữNhật` kế thừa từ lớp `HìnhHọc`.
B. Một phương thức `tínhDiệnTích` được định nghĩa khác nhau trong lớp `HìnhTròn` và lớp `HìnhVuông`.
C. Sử dụng từ khóa `private` để ẩn giấu thuộc tính của lớp.
D. Tạo ra một lớp trừu tượng `ĐộngVật` với phương thức trừu tượng `kêu`.
5. Kiểu quan hệ nào sau đây thể hiện mối quan hệ `has-a` (có một) trong OOP?
A. Inheritance (kế thừa).
B. Polymorphism (đa hình).
C. Encapsulation (đóng gói).
D. Composition (thành phần) và Aggregation (tập hợp).
6. Trong lập trình hướng đối tượng, thuật ngữ `coupling` (kết nối) đề cập đến điều gì?
A. Mức độ liên kết hoặc phụ thuộc lẫn nhau giữa các module, lớp hoặc đối tượng trong hệ thống.
B. Quá trình tạo ra các đối tượng từ lớp.
C. Khả năng tái sử dụng mã nguồn.
D. Tốc độ thực thi chương trình.
7. Phương thức khởi tạo (constructor) trong lớp có vai trò gì?
A. Hủy bỏ đối tượng khi nó không còn được sử dụng.
B. Được gọi tự động khi một đối tượng được tạo ra để khởi tạo các thuộc tính của đối tượng.
C. Định nghĩa hành vi của đối tượng khi thực hiện một phép toán số học.
D. Khai báo các biến thành viên tĩnh của lớp.
8. Tính kế thừa (inheritance) trong OOP mang lại lợi ích chính nào?
A. Tăng tốc độ thực thi chương trình.
B. Giảm thiểu sử dụng bộ nhớ.
C. Tái sử dụng mã nguồn và thiết lập quan hệ `là một` (is-a).
D. Tăng cường tính bảo mật của dữ liệu.
9. Nguyên tắc `Dependency Inversion Principle` (DIP) trong SOLID khuyến khích điều gì?
A. Sử dụng các lớp con thay vì lớp cha.
B. Không nên phụ thuộc vào các lớp cụ thể mà nên phụ thuộc vào abstraction (lớp trừu tượng hoặc interface).
C. Giảm thiểu số lượng lớp trong một dự án.
D. Tăng cường tính tuần tự trong thực thi chương trình.
10. Phương thức tĩnh (static method) trong lớp có đặc điểm gì?
A. Luôn luôn được gọi trước phương thức khởi tạo.
B. Thuộc về lớp chứ không thuộc về đối tượng cụ thể nào của lớp đó và có thể được gọi trực tiếp thông qua tên lớp.
C. Không thể truy cập các thuộc tính của lớp.
D. Phải được ghi đè ở lớp con.
11. Tính đa hình (polymorphism) trong OOP thể hiện điều gì?
A. Khả năng ẩn giấu thông tin chi tiết của đối tượng.
B. Khả năng một đối tượng thuộc nhiều lớp khác nhau.
C. Khả năng các đối tượng thuộc các lớp khác nhau có thể phản ứng khác nhau với cùng một thông điệp hoặc phương thức.
D. Khả năng tạo ra nhiều lớp từ một lớp cha.
12. Trong lập trình hướng đối tượng, `thành phần` (composition) thể hiện mối quan hệ nào giữa các lớp?
A. Quan hệ `là một loại` (is-a).
B. Quan hệ `có một` (has-a) mạnh mẽ, trong đó một đối tượng chứa các đối tượng khác như là thành phần không thể thiếu.
C. Quan hệ `sử dụng` (uses-a).
D. Quan hệ kế thừa.
13. Trong lập trình hướng đối tượng, `lớp` (class) đóng vai trò gì?
A. Một thể hiện cụ thể của đối tượng.
B. Một bản thiết kế hoặc khuôn mẫu để tạo ra các đối tượng.
C. Một phương thức đặc biệt dùng để khởi tạo đối tượng.
D. Một biến toàn cục dùng chung cho tất cả các đối tượng.
14. Phương thức `getter` và `setter` được sử dụng để làm gì trong OOP?
A. Tạo ra các đối tượng mới và hủy bỏ đối tượng cũ.
B. Quản lý bộ nhớ và tối ưu hóa hiệu suất.
C. Truy cập và sửa đổi giá trị của các thuộc tính private một cách có kiểm soát.
D. Thực hiện các phép toán số học trên đối tượng.
15. Phương pháp `Dependency Injection` (DI) trong OOP giúp đạt được mục tiêu chính nào?
A. Tăng tốc độ biên dịch chương trình.
B. Giảm coupling (kết nối) giữa các lớp và tăng tính linh hoạt, khả năng kiểm thử.
C. Tối ưu hóa sử dụng bộ nhớ.
D. Tăng cường tính bảo mật dữ liệu.
16. Phương thức trừu tượng (abstract method) là gì?
A. Phương thức có thể được gọi từ bất kỳ đâu trong chương trình.
B. Phương thức được định nghĩa trong lớp trừu tượng nhưng không có phần thân (body) và phải được hiện thực hóa ở lớp con.
C. Phương thức dùng để tạo ra các đối tượng.
D. Phương thức không thể bị lớp con ghi đè.
17. Nguyên tắc `Single Responsibility Principle` (SRP) trong SOLID phát biểu điều gì?
A. Một lớp chỉ nên có một và chỉ một lý do để thay đổi.
B. Phần mềm nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con có thể thay thế cho lớp cha mà không làm thay đổi tính đúng đắn của chương trình.
D. Nên chia nhỏ các interface lớn thành các interface nhỏ hơn, cụ thể hơn.
18. Nguyên tắc `SOLID` trong OOP là tập hợp các nguyên tắc thiết kế hướng đến mục tiêu nào?
A. Tăng hiệu suất và tốc độ thực thi.
B. Giảm thiểu lỗi cú pháp trong quá trình lập trình.
C. Thiết kế phần mềm dễ bảo trì, dễ mở rộng và linh hoạt.
D. Bảo vệ dữ liệu khỏi truy cập trái phép.
19. Trong OOP, lỗi `NullPointerException` thường xảy ra khi nào?
A. Khi cố gắng truy cập một biến static trước khi nó được khởi tạo.
B. Khi cố gắng truy cập hoặc thao tác trên một đối tượng mà biến tham chiếu đến nó đang có giá trị null (không trỏ đến đối tượng nào).
C. Khi chia cho số 0.
D. Khi vượt quá giới hạn bộ nhớ.
20. Kiểu quan hệ nào sau đây thể hiện mối quan hệ `is-a` (là một loại) trong OOP?
A. Composition (thành phần).
B. Aggregation (tập hợp).
C. Inheritance (kế thừa).
D. Association (liên kết).
21. Nguyên tắc `Liskov Substitution Principle` (LSP) trong SOLID liên quan đến vấn đề gì?
A. Tính trừu tượng hóa dữ liệu.
B. Khả năng thay thế lớp cha bằng lớp con mà không làm hỏng chương trình.
C. Kiểm soát truy cập dữ liệu.
D. Quản lý tài nguyên hệ thống.
22. Thuật ngữ `cohesion` (kết dính) trong OOP đề cập đến điều gì?
A. Mức độ liên kết giữa các lớp trong hệ thống.
B. Mức độ mà các phần tử bên trong một module, lớp hoặc phương thức thuộc về nhau và cùng hướng đến một mục tiêu chung.
C. Số lượng đối tượng được tạo ra từ một lớp.
D. Khả năng mở rộng của chương trình.
23. Nguyên tắc `Open/Closed Principle` (OCP) trong SOLID khuyến khích điều gì?
A. Ưu tiên thành phần hơn kế thừa.
B. Phần mềm nên mở để mở rộng nhưng đóng để sửa đổi.
C. Không nên phụ thuộc vào các lớp cụ thể mà nên phụ thuộc vào abstraction (lớp trừu tượng hoặc interface).
D. Đảm bảo tính nhất quán của giao diện người dùng.
24. Mục đích chính của việc sử dụng `design patterns` (mẫu thiết kế) trong OOP là gì?
A. Tăng tốc độ biên dịch chương trình.
B. Giải quyết các vấn đề thiết kế phần mềm thường gặp một cách hiệu quả và đã được kiểm chứng.
C. Giảm thiểu kích thước mã nguồn.
D. Tăng cường tính bảo mật cho ứng dụng web.
25. Lớp trừu tượng (abstract class) khác với lớp thông thường như thế nào?
A. Lớp trừu tượng có thể tạo ra đối tượng, lớp thông thường thì không.
B. Lớp trừu tượng không thể chứa phương thức, lớp thông thường thì có thể.
C. Lớp trừu tượng không thể được kế thừa, lớp thông thường thì có thể.
D. Lớp trừu tượng không thể được khởi tạo trực tiếp và có thể chứa các phương thức trừu tượng, lớp thông thường thì có thể được khởi tạo và không nhất thiết chứa phương thức trừu tượng.
26. Trong OOP, `tính đóng gói` (encapsulation) đạt được chủ yếu thông qua cơ chế nào?
A. Sử dụng lớp trừu tượng và giao diện.
B. Sử dụng các từ khóa kiểm soát truy cập (access modifiers) như public, private, protected.
C. Sử dụng tính đa hình để che giấu chi tiết thực thi.
D. Sử dụng tính kế thừa để tái sử dụng mã nguồn.
27. Trong ngữ cảnh của lập trình hướng đối tượng, `refactoring` (tái cấu trúc mã) là gì?
A. Viết lại toàn bộ mã nguồn từ đầu.
B. Thay đổi chức năng của phần mềm.
C. Cải thiện cấu trúc mã nguồn mà không thay đổi chức năng bên ngoài của nó, nhằm tăng tính dễ đọc, dễ bảo trì.
D. Tối ưu hóa hiệu suất chương trình bằng cách giảm số dòng code.
28. Lợi ích của việc sử dụng `composition` (thành phần) thay vì `inheritance` (kế thừa) trong một số trường hợp là gì?
A. Tăng hiệu suất chương trình.
B. Giảm độ phức tạp của hệ thống phân cấp lớp và tăng tính linh hoạt trong việc kết hợp các hành vi.
C. Đơn giản hóa việc gỡ lỗi.
D. Tăng cường tính bảo mật dữ liệu.
29. Nguyên tắc `Interface Segregation Principle` (ISP) trong SOLID đề xuất giải pháp nào?
A. Tăng cường tính đóng gói bằng cách sử dụng access modifiers.
B. Chia nhỏ các interface lớn thành các interface nhỏ hơn, cụ thể hơn, để lớp thực thi chỉ cần implement các phương thức cần thiết.
C. Sử dụng dependency injection để giảm sự phụ thuộc giữa các lớp.
D. Tái sử dụng mã nguồn thông qua kế thừa.
30. Đối tượng (object) trong lập trình hướng đối tượng là gì?
A. Một từ khóa dùng để khai báo lớp.
B. Một bản thiết kế trừu tượng của dữ liệu.
C. Một thể hiện cụ thể của một lớp.
D. Một phương thức tĩnh trong lớp.