1. Mục đích của việc sử dụng `design patterns` (mẫu thiết kế) trong lập trình hướng đối tượng là gì?
A. Tăng tốc độ biên dịch chương trình.
B. Cung cấp các giải pháp đã được kiểm chứng cho các vấn đề thiết kế phần mềm thường gặp.
C. Giảm dung lượng bộ nhớ sử dụng của chương trình.
D. Tự động tạo mã nguồn chương trình.
2. Quan hệ `tổng hợp` (aggregation) khác với quan hệ `hợp thành` (composition) chủ yếu ở điểm nào?
A. Trong tổng hợp, các đối tượng có vòng đời phụ thuộc vào nhau, còn trong hợp thành thì không.
B. Trong hợp thành, các đối tượng có vòng đời phụ thuộc vào nhau, còn trong tổng hợp thì không.
C. Tổng hợp thể hiện quan hệ `là một loại` (is-a), còn hợp thành thể hiện quan hệ `có một` (has-a).
D. Hợp thành chỉ áp dụng cho các lớp trừu tượng, còn tổng hợp áp dụng cho lớp cụ thể.
3. Nguyên tắc cơ bản nào của lập trình hướng đối tượng (OOP) cho phép các đối tượng thuộc các lớp khác nhau phản ứng theo những cách khác nhau đối với cùng một thông điệp hoặc lệnh gọi phương thức?
A. Tính đóng gói (Encapsulation)
B. Tính trừu tượng (Abstraction)
C. Tính đa hình (Polymorphism)
D. Tính kế thừa (Inheritance)
4. Điều gì KHÔNG phải là một đặc điểm chính của lập trình hướng đối tượng?
A. Tính tuần tự
B. Tính đóng gói
C. Tính kế thừa
D. Tính đa hình
5. Trong OOP, `đa kế thừa` (multiple inheritance) có thể gây ra vấn đề gì?
A. Giảm hiệu suất chương trình.
B. Tăng độ phức tạp và gây ra `vấn đề kim cương` (diamond problem) về xung đột tên và kế thừa.
C. Giảm tính tái sử dụng mã.
D. Làm cho chương trình khó kiểm thử hơn.
6. Trong OOP, `lớp` (class) được xem như là:
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 cho các đối tượng
C. Một phương thức đặc biệt để tạo đối tượng
D. Một biến lưu trữ dữ liệu của đối tượng
7. Trong OOP, `tính đa hình nạp chồng` (method overloading) xảy ra khi nào?
A. Một lớp con ghi đè phương thức của lớp cha
B. Một lớp có nhiều phương thức cùng tên nhưng khác nhau về tham số
C. Các lớp khác nhau có phương thức cùng tên và cùng tham số
D. Một đối tượng có thể thuộc nhiều lớp khác nhau
8. Nguyên tắc `Phân tách giao diện` (Interface Segregation Principle - ISP) trong SOLID khuyến nghị điều gì?
A. Mỗi lớp chỉ nên có một trách nhiệm duy nhất.
B. Các lớp dẫn xuất phải thay thế được các lớp cơ sở của chúng.
C. Các thực thể phần mềm nên mở cho mở rộng, nhưng đóng cho sửa đổi.
D. Nhiều giao diện đặc thù tốt hơn là một giao diện tổng quát.
9. Nguyên tắc `Mở - Đóng` (Open/Closed Principle - OCP) trong SOLID phát biểu rằng:
A. Mỗi lớp chỉ nên có một trách nhiệm duy nhất.
B. Các lớp dẫn xuất phải thay thế được các lớp cơ sở của chúng.
C. Các thực thể phần mềm nên mở cho mở rộng, nhưng đóng cho sửa đổi.
D. Các giao diện đặc thù tốt hơn là một giao diện tổng quát.
10. Phương thức khởi tạo (constructor) trong một lớp OOP có vai trò chính là gì?
A. Hủy bỏ đối tượng khi không còn sử dụng
B. Thay đổi trạng thái của đối tượng sau khi tạo
C. Khởi tạo trạng thái ban đầu cho đối tượng khi nó được tạo ra
D. Thực hiện các phép tính toán trên dữ liệu của đối tượng
11. Điều gì KHÔNG phải là lợi ích chính của việc sử dụng lập trình hướng đối tượng?
A. Tăng khả năng tái sử dụng mã nguồn
B. Cải thiện hiệu suất thực thi chương trình
C. Giảm độ phức tạp trong quản lý dự án lớn
D. Tăng tính dễ bảo trì và mở rộng của phần mềm
12. Trong OOP, `phạm vi truy cập` (access modifier) `protected` có ý nghĩa gì?
A. Chỉ có thể truy cập từ bên trong lớp và các lớp con trực tiếp.
B. Chỉ có thể truy cập từ bên trong lớp và các lớp con (kể cả gián tiếp) trong cùng gói (package).
C. Có thể truy cập từ bất kỳ đâu.
D. Chỉ có thể truy cập từ bên trong lớp.
13. Trong OOP, `đa hình tham số` (parameterized polymorphism hoặc generics) cho phép điều gì?
A. Tạo ra các lớp và phương thức có thể làm việc với nhiều kiểu dữ liệu khác nhau mà vẫn đảm bảo an toàn kiểu.
B. Một đối tượng thuộc nhiều lớp cùng một lúc.
C. Phương thức có thể có nhiều tên khác nhau.
D. Các lớp khác nhau có thể có phương thức trùng tên và chức năng.
14. Trong OOP, `phương thức trừu tượng` (abstract method) là gì?
A. Phương thức không thể được gọi trực tiếp từ đối tượng.
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 triển khai ở lớp con.
C. Phương thức chỉ được sử dụng cho mục đích kiểm thử (testing).
D. Phương thức không thể bị ghi đè (overridden) trong lớp con.
15. Điều gì xảy ra khi một lớp con `ghi đè` (override) một phương thức của lớp cha?
A. Phương thức của lớp cha sẽ bị xóa bỏ.
B. Phương thức của lớp cha vẫn tồn tại và được gọi thay vì phương thức của lớp con.
C. Phương thức của lớp con thay thế hoàn toàn phương thức của lớp cha khi phương thức đó được gọi trên đối tượng của lớp con.
D. Cả phương thức của lớp cha và lớp con đều được thực thi tuần tự.
16. Từ khóa `super` (hoặc tương đương trong ngôn ngữ khác) thường được sử dụng trong lớp con để làm gì?
A. Truy cập các thuộc tính và phương thức tĩnh của lớp cha.
B. Gọi phương thức khởi tạo (constructor) của lớp cha.
C. Ngăn chặn việc kế thừa từ lớp cha.
D. Tạo một bản sao của đối tượng lớp cha.
17. Khi nào nên sử dụng `composition` (hợp thành) thay vì `inheritance` (kế thừa) trong thiết kế OOP?
A. Khi muốn tái sử dụng mã nguồn từ lớp cha một cách tối đa.
B. Khi mối quan hệ giữa các lớp là `is-a` (là một loại).
C. Khi muốn tạo ra mối quan hệ `has-a` (có một) và cần sự linh hoạt, giảm sự phụ thuộc chặt chẽ giữa các lớp.
D. Khi muốn hiện thực tính đa hình ở thời gian biên dịch.
18. Trong ngữ cảnh của tính kế thừa (inheritance), lớp `con` (child class hoặc subclass) KHÔNG được kế thừa điều gì từ lớp `cha` (parent class hoặc superclass)?
A. Các thuộc tính (attributes) công khai và bảo vệ
B. Các phương thức (methods) công khai và bảo vệ
C. Phương thức khởi tạo (constructor) của lớp cha
D. Các thuộc tính và phương thức tĩnh (static)
19. Mục đích chính của việc sử dụng `tính trừu tượng` (abstraction) trong OOP là gì?
A. Tăng cường tính bảo mật của dữ liệu
B. Giảm sự phụ thuộc giữa các lớp
C. Ẩn giấu sự phức tạp và chỉ hiển thị các thông tin cần thiết
D. Cho phép tạo ra các đối tượng ảo
20. Trong các nguyên tắc SOLID, nguyên tắc `Nguyên tắc đảo ngược phụ thuộc` (Dependency Inversion Principle - DIP) khuyến khích điều gì?
A. Các lớp có mức trừu tượng cao không nên phụ thuộc vào các lớp có mức trừu tượng thấp. Cả hai nên phụ thuộc vào trừu tượng.
B. Mỗi lớp chỉ nên có một trách nhiệm duy nhất.
C. Phần mềm nên mở cho mở rộng, nhưng đóng cho sửa đổi.
D. Các giao diện đặc thù tốt hơn là một giao diện tổng quát.
21. Nguyên tắc `Nguyên tắc thay thế Liskov` (Liskov Substitution Principle - LSP) trong SOLID nói về điều gì?
A. Mỗi lớp chỉ nên có một lý do duy nhất để thay đổi.
B. Các lớp dẫn xuất (subtypes) phải có khả năng thay thế cho các lớp cơ sở (base types) của chúng mà không làm thay đổi tính đúng đắn của chương trình.
C. Các thực thể phần mềm (lớp, module, hàm,...) nên mở cho mở rộng nhưng đóng cho sửa đổi.
D. Nhiều giao diện đặc thù tốt hơn là một giao diện tổng quát.
22. Trong OOP, `phân lớp` (subtyping) và `kế thừa` (inheritance) có mối quan hệ như thế nào?
A. Phân lớp là một dạng đặc biệt của kế thừa.
B. Kế thừa là một dạng đặc biệt của phân lớp.
C. Phân lớp và kế thừa là hai khái niệm hoàn toàn độc lập.
D. Phân lớp và kế thừa là hai tên gọi khác nhau của cùng một khái niệm.
23. Khái niệm `tính đóng gói` (encapsulation) trong OOP chủ yếu nhằm mục đích gì?
A. Tăng tốc độ thực thi chương trình
B. Giảm dung lượng bộ nhớ sử dụng
C. Ẩn giấu thông tin và bảo vệ dữ liệu của đối tượng
D. Cho phép kế thừa thuộc tính và phương thức
24. Khái niệm `phương thức truy cập` (accessor method) và `phương thức biến đổi` (mutator method) thường được sử dụng để làm gì trong OOP?
A. Tối ưu hóa hiệu suất truy cập và thay đổi dữ liệu.
B. Kiểm soát quyền truy cập và sửa đổi dữ liệu bên trong đối tượng, tuân thủ nguyên tắc đóng gói.
C. Tạo ra các phương thức đa hình.
D. Quản lý bộ nhớ cho đối tượng.
25. Thuộc tính hoặc phương thức `tĩnh` (static) trong OOP có đặc điểm gì?
A. Chỉ có thể được truy cập từ bên trong lớp
B. Thuộc về lớp chứ không phải là đối tượng cụ thể của lớp
C. Không thể được kế thừa bởi lớp con
D. Luôn luôn là công khai (public)
26. Lỗi `Null Pointer Exception` (hoặc tương đương trong các ngôn ngữ khác) thường xảy ra trong OOP khi nào?
A. Khi cố gắng truy cập một biến tĩnh chưa được khởi tạo.
B. Khi cố gắng truy cập một thuộc tính hoặc phương thức của một đối tượng tham chiếu đến 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ớ.
27. Trong OOP, `giao diện` (interface) khác với `lớp trừu tượng` (abstract class) chủ yếu ở điểm nào?
A. Giao diện có thể chứa các phương thức đã được triển khai, còn lớp trừu tượng thì không
B. Một lớp có thể kế thừa từ nhiều giao diện, nhưng chỉ có thể kế thừa từ một lớp trừu tượng
C. Lớp trừu tượng không thể có thuộc tính, còn giao diện thì có thể
D. Giao diện được sử dụng để tạo đối tượng trực tiếp, còn lớp trừu tượng thì không
28. Phương thức `ảo` (virtual method) trong OOP (ví dụ trong C++) chủ yếu liên quan đến khái niệm nào?
A. Tính đóng gói (Encapsulation)
B. Tính trừu tượng (Abstraction)
C. Tính đa hình (Polymorphism) ở thời gian chạy
D. Tính kế thừa (Inheritance) đa lớp
29. Ưu điểm chính của việc sử dụng `tính đóng gói` (encapsulation) trong phát triển phần mềm là gì?
A. Tăng hiệu suất chương trình bằng cách giảm số lượng biến toàn cục.
B. Giảm sự phức tạp và tăng tính dễ bảo trì bằng cách ẩn chi tiết triển khai và kiểm soát truy cập dữ liệu.
C. Cho phép tạo ra các chương trình chạy đa luồng dễ dàng hơn.
D. Tăng khả năng tương thích giữa các hệ điều hành khác nhau.
30. Quan hệ `kết hợp` (association) giữa các lớp trong OOP thể hiện điều gì?
A. Quan hệ `là một` (is-a)
B. Quan hệ `có một` (has-a)
C. Quan hệ kế thừa
D. Quan hệ phụ thuộc mạnh mẽ, khi hủy đối tượng này sẽ hủy đối tượng kia