1. Khi nào nên sử dụng `composition` (thành phần) thay vì `inheritance` (kế thừa)?
A. Khi có mối quan hệ `is-a` giữa các đối tượng.
B. Khi muốn tái sử dụng mã nguồn của một class mà không cần tạo mối quan hệ `is-a`. Khi muốn thể hiện quan hệ `has-a` mạnh mẽ, đối tượng thành phần phụ thuộc vào vòng đời của đối tượng chứa.
C. Khi muốn ẩn giấu thông tin chi tiết của đối tượng.
D. Khi cần tạo ra nhiều hình thức khác nhau cho một phương thức.
2. Nhược điểm tiềm ẩn của việc lạm dụng `inheritance` (kế thừa) trong OOP là gì?
A. Giảm hiệu suất chương trình.
B. Tăng tính phức tạp và khó bảo trì hệ thống phân cấp lớp, có thể dẫn đến vấn đề `fragile base class problem`.
C. Giảm tính tái sử dụng mã nguồn.
D. Hạn chế khả năng mở rộng của chương trình.
3. Khái niệm `loose coupling` (kết hợp lỏng lẻo) trong OOP có ý nghĩa gì?
A. Các thành phần phần mềm phụ thuộc chặt chẽ vào nhau.
B. Các thành phần phần mềm ít phụ thuộc vào nhau, thay đổi ở một thành phần ít ảnh hưởng đến các thành phần khác, tăng tính linh hoạt và bảo trì.
C. Tăng tốc độ thực thi chương trình.
D. Giảm dung lượng mã nguồn.
4. Lợi ích chính của việc sử dụng lập trình hướng đối tượng (OOP) so với lập trình hướng thủ tục là gì?
A. Tăng tốc độ thực thi chương trình.
B. Dễ dàng quản lý các chương trình nhỏ.
C. Tăng tính tái sử dụng, bảo trì và mở rộng mã nguồn, phù hợp với các dự án lớn và phức tạp.
D. Giảm dung lượng bộ nhớ sử dụng.
5. Quan hệ `is-a` (là một) thường được thể hiện thông qua cơ chế nào trong lập trình hướng đối tượng?
A. Quan hệ kết hợp (Association)
B. Quan hệ tổng hợp (Aggregation)
C. Quan hệ thành phần (Composition)
D. Quan hệ kế thừa (Inheritance)
6. Lớp `abstract` (trừu tượng) trong OOP có đặc điểm gì?
A. Có thể tạo ra đối tượng trực tiếp từ lớp abstract.
B. Không thể tạo ra đối tượng trực tiếp, mà chỉ có thể được kế thừa bởi các lớp con cụ thể.
C. Chỉ chứa các phương thức static.
D. Không thể chứa thuộc tính.
7. Trong OOP, `constructor chaining` (chuỗi khởi tạo) là gì?
A. Việc hủy đối tượng theo chuỗi.
B. Việc một constructor gọi một constructor khác của cùng class hoặc lớp cha, thường để tái sử dụng mã khởi tạo.
C. Việc tạo ra một chuỗi các đối tượng liên kết với nhau.
D. Việc gọi các phương thức của đối tượng theo chuỗi.
8. Trong lập trình hướng đối tượng, `class` được hiểu là gì?
A. Một thể hiện cụ thể của đối tượng.
B. Một khuôn mẫu hoặc bản thiết kế cho các đối tượng.
C. Một phương thức đặc biệt để khởi tạo đối tượng.
D. Một biến toàn cục được chia sẻ giữa các đối tượng.
9. Mẫu thiết kế `Singleton` trong OOP được sử dụng để làm gì?
A. Tạo ra nhiều đối tượng của một class.
B. Đảm bảo rằng một class chỉ có duy nhất một instance (đối tượng) và cung cấp một điểm truy cập toàn cục đến instance đó.
C. Tạo ra các đối tượng phức tạp từ các đối tượng đơn giản.
D. Quản lý bộ nhớ hiệu quả hơn.
10. Nguyên tắc `Single Responsibility Principle` (SRP) trong SOLID phát biểu điều gì?
A. Một class nên có nhiều trách nhiệm.
B. Một class chỉ nên có một và chỉ một lý do để thay đổi, tức là một trách nhiệm duy nhất.
C. Các class nên kế thừa từ nhiều lớp cha.
D. Các class nên phụ thuộc chặt chẽ vào nhau.
11. Trong OOP, `interface` (giao diện) được sử dụng để làm gì?
A. Cung cấp một triển khai cụ thể của một class.
B. Định nghĩa một tập hợp các phương thức mà các class thực hiện interface đó phải cung cấp, đảm bảo tính nhất quán về hành vi.
C. Tạo ra các đối tượng phức tạp bằng cách kết hợp các đối tượng đơn giản.
D. Ẩn giấu hoàn toàn dữ liệu bên trong đối tượng.
12. Khi nào nên sử dụng `inheritance` (kế thừa) trong thiết kế OOP?
A. Khi cần tạo ra các đối tượng độc lập, không liên quan đến nhau.
B. Khi muốn tái sử dụng mã nguồn và xây dựng mối quan hệ `is-a` giữa các class.
C. Khi muốn ẩn giấu thông tin chi tiết của đối tượng.
D. Khi cần tạo ra nhiều hình thức khác nhau cho một phương thức.
13. Thuộc tính nào của lập trình hướng đối tượng cho phép một đối tượng thuộc lớp con (subclass) kế thừa các thuộc tính và phương thức từ lớp cha (superclass)?
A. Đa hình
B. Trừu tượng
C. Đóng gói
D. Kế thừa
14. Phương thức `abstract` (trừu tượng) trong OOP có đặc điểm gì?
A. Có thể có phần thân (implementation) cụ thể.
B. Không có phần thân (implementation) và phải được ghi đè (override) bởi các lớp con cụ thể.
C. Chỉ được sử dụng trong interface.
D. Luôn là phương thức static.
15. Trong ngữ cảnh OOP, `method overriding` (ghi đè phương thức) là gì?
A. Việc tạo ra một phương thức mới trong lớp cha.
B. Việc lớp con định nghĩa lại một phương thức đã có ở lớp cha với cùng tên và kiểu tham số, cung cấp một triển khai đặc biệt cho lớp con.
C. Việc ẩn giấu một phương thức của lớp cha khỏi lớp con.
D. Việc gọi một phương thức của lớp cha từ lớp con.
16. Tính đa hình (Polymorphism) trong OOP có nghĩa là 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.
C. Khả năng một đối tượng có nhiều thuộc tính.
D. Khả năng một đối tượng hoặc phương thức có nhiều hình thức hoặc hành vi khác nhau trong các ngữ cảnh khác nhau.
17. Khái niệm `encapsulation` (đóng gói) giúp đạt được mục tiêu nào quan trọng trong thiết kế phần mềm?
A. Tăng tốc độ phát triển phần mềm.
B. Giảm chi phí phần cứng.
C. Tăng tính bảo trì, khả năng thay đổi và giảm sự phụ thuộc lẫn nhau giữa các thành phần phần mềm.
D. Tối ưu hóa hiệu suất sử dụng bộ nhớ.
18. Nguyên tắc `Liskov Substitution Principle` (LSP) trong SOLID phát biểu điều gì?
A. Các lớp con có thể thay thế lớp cha ở bất cứ đâu mà không làm thay đổi tính đúng đắn của chương trình.
B. Các lớp con không thể thay thế lớp cha.
C. Chỉ lớp cha mới có thể thay thế lớp con.
D. Không có mối quan hệ thay thế giữa lớp cha và lớp con.
19. Lỗi `NullPointerException` thường xảy ra trong OOP do nguyên nhân nào?
A. Truy cập vào một thuộc tính hoặc phương thức của một đối tượng khi đối tượng đó chưa được khởi tạo hoặc có giá trị null.
B. Chia cho số 0.
C. Vượt quá giới hạn mảng.
D. Lỗi cú pháp trong mã nguồn.
20. Mục đích chính của việc sử dụng `access modifiers` (ví dụ: public, private, protected) trong OOP là gì?
A. Tăng tốc độ thực thi chương trình.
B. Quản lý bộ nhớ hiệu quả hơn.
C. Kiểm soát quyền truy cập đến các thành viên (thuộc tính, phương thức) của class, tăng tính đóng gói và bảo mật.
D. Giảm dung lượng mã nguồn.
21. Trong OOP, `object` (đối tượng) là gì?
A. Một class.
B. Một bản thiết kế cho các đối tượng.
C. Một thể hiện cụ thể của một class, có trạng thái và hành vi.
D. Một phương thức đặc biệt.
22. Phương thức nào sau đây thường được sử dụng để khởi tạo trạng thái ban đầu cho một đối tượng trong lập trình hướng đối tượng?
A. Phương thức hủy (Destructor)
B. Phương thức tĩnh (Static method)
C. Phương thức khởi tạo (Constructor)
D. Phương thức truy cập (Accessor method)
23. Khi nào nên sử dụng `interface` (giao diện) thay vì `abstract class` (lớp trừu tượng)?
A. Khi muốn cung cấp một phần triển khai mặc định cho một số phương thức.
B. Khi một lớp cần kế thừa hành vi từ nhiều nguồn khác nhau (đa kế thừa giao diện).
C. Khi muốn tạo ra một hệ thống phân cấp lớp chặt chẽ.
D. Khi chỉ cần định nghĩa một lớp cơ sở chung có thể khởi tạo đối tượng.
24. 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 tốc độ phát triển phần mềm.
B. Giảm chi phí phần cứng.
C. Thiết kế phần mềm dễ hiểu, linh hoạt, bảo trì và mở rộng, giảm độ phức tạp và sự phụ thuộc.
D. Tối ưu hóa hiệu suất sử dụng bộ nhớ.
25. Mẫu thiết kế `Factory` (Nhà máy) trong OOP giúp giải quyết vấn đề gì?
A. Quản lý vòng đời của đối tượng.
B. Che giấu sự phức tạp của việc tạo đối tượng và cung cấp một cách linh hoạt để tạo ra các đối tượng thuộc các class khác nhau dựa trên điều kiện hoặc cấu hình.
C. Tối ưu hóa hiệu suất chương trình.
D. Đảm bảo tính duy nhất của đối tượng.
26. Khái niệm nào sau đây là trụ cột của lập trình hướng đối tượng, cho phép đóng gói dữ liệu và phương thức thao tác dữ liệu đó vào trong một đơn vị duy nhất?
A. Tính trừu tượng (Abstraction)
B. Tính đóng gói (Encapsulation)
C. Tính kế thừa (Inheritance)
D. Tính đa hình (Polymorphism)
27. Trong OOP, `design patterns` (mẫu thiết kế) là gì?
A. Các mẫu giao diện người dùng đẹp mắt.
B. Các giải pháp thiết kế đã được kiểm chứng và tái sử dụng cho các vấn đề thiết kế phần mềm thường gặp.
C. Các quy tắc đặt tên biến và phương thức.
D. Các thuật toán tối ưu hóa hiệu suất.
28. Phương thức `static` trong OOP có đặc điểm gì?
A. Chỉ có thể được gọi từ các đối tượng của class.
B. Không thuộc về bất kỳ đối tượng cụ thể nào của class, mà thuộc về class đó.
C. Luôn được kế thừa bởi lớp con.
D. Chỉ được sử dụng trong phương thức khởi tạo.
29. Trong lập trình hướng đối tượng, `tính trừu tượng` (abstraction) thể hiện điều gì?
A. Che giấu các thuộc tính của đối tượng.
B. Chỉ hiển thị các thông tin cần thiết và ẩn đi các chi tiết triển khai phức tạp.
C. Tạo ra nhiều hình thức khác nhau cho một đối tượng.
D. Cho phép lớp con kế thừa từ lớp cha.
30. Điểm khác biệt chính giữa `Aggregation` (tổng hợp) và `Composition` (thành phần) trong OOP là gì?
A. Aggregation mạnh hơn Composition về mức độ ràng buộc.
B. Composition mạnh hơn Aggregation về mức độ ràng buộc và sự phụ thuộc về vòng đời.
C. Aggregation chỉ áp dụng cho thuộc tính, Composition chỉ áp dụng cho phương thức.
D. Không có sự khác biệt đáng kể giữa Aggregation và Composition.