1. Tính chất `kế thừa` (inheritance) trong OOP mang lại lợi ích nào sau đây?
A. Giảm thiểu tính đóng gói của dữ liệu.
B. Tăng tính phức tạp của mã nguồn.
C. Cho phép tái sử dụng mã nguồn và xây dựng hệ thống phân cấp lớp.
D. Hạn chế khả năng mở rộng của chương trình.
2. 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 độ viết code.
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 kích thước mã nguồn.
D. Che giấu hoàn toàn mã nguồn.
3. Phương thức trừu tượng (abstract method) là gì?
A. Phương thức đã được hiện thực hóa hoàn chỉnh trong lớp cha.
B. Phương thức chỉ được khai báo trong lớp cha mà không có hiện thực, và phải được hiện thực hóa ở lớp con.
C. Phương thức không thể truy cập từ bên ngoài class.
D. Phương thức chỉ được sử dụng để hủy đối tượng.
4. Phương thức khởi tạo (constructor) trong lập trình hướng đối tượng có vai trò chính là gì?
A. Hủy bỏ đối tượng khi không còn sử dụng.
B. Khởi tạo giá trị ban đầu cho các thuộc tính của đối tượng khi đối tượng được tạo.
C. Thực hiện các phép toán số học trên đối tượng.
D. Định nghĩa hành vi của đối tượng khi tương tác với người dùng.
5. Trong lập trình hướng đối tượng, từ khóa `super` thường được sử dụng để làm gì?
A. Tạo ra một lớp cha mới.
B. Truy cập các thành viên (thuộc tính, phương thức) của lớp cha từ lớp con.
C. Hủy bỏ một đối tượng.
D. Kiểm tra kiểu dữ liệu của đối tượng.
6. Điều gì KHÔNG phải là một lợi ích chính của lập trình hướng đối tượng?
A. Tái sử dụng mã nguồn.
B. Tính dễ bảo trì và mở rộng.
C. Tăng tốc độ thực thi chương trình.
D. Mô hình hóa thế giới thực một cách tự nhiên.
7. Nguyên tắc `SOLID` nào khuyến khích các lớp nên mở để mở rộng nhưng đóng để sửa đổi?
A. Nguyên tắc duy nhất trách nhiệm (Single Responsibility Principle - SRP)
B. Nguyên tắc đóng mở (Open/Closed Principle - OCP)
C. Nguyên tắc thay thế Liskov (Liskov Substitution Principle - LSP)
D. Nguyên tắc đảo ngược phụ thuộc (Dependency Inversion Principle - DIP)
8. Sự khác biệt chính giữa `class` và `object` là gì?
A. Class là một thể hiện, object là bản thiết kế.
B. Class là bản thiết kế, object là một thể hiện cụ thể của class.
C. Class và object là hai khái niệm đồng nhất.
D. Object chứa các class bên trong nó.
9. 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 trực tiếp, 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 trừu tượng, lớp thông thường thì có thể.
C. Lớp trừu tượng không thể tạo ra đối tượng trực tiếp, và có thể chứa phương thức trừu tượng.
D. Lớp trừu tượng và lớp thông thường hoàn toàn giống nhau.
10. Điều gì KHÔNG phải là một đặc điểm của lập trình hướng đối tượng?
A. Hướng đối tượng tập trung vào dữ liệu và các thao tác trên dữ liệu.
B. Hướng đối tượng sử dụng các khái niệm như lớp, đối tượng, kế thừa, đa hình.
C. Hướng đối tượng giúp tổ chức mã nguồn thành các đơn vị module độc lập.
D. Hướng đối tượng hỗ trợ tái sử dụng mã và mở rộng hệ thống.
11. Khi nào nên sử dụng `composition` (tổng hợp) thay vì `inheritance` (kế thừa) trong OOP?
A. Khi muốn tái sử dụng mã nguồn từ một lớp khác.
B. Khi có mối quan hệ `is-a` giữa các lớp.
C. Khi có mối quan hệ `has-a` (có một) giữa các lớp, và muốn linh hoạt hơn trong việc thay đổi hành vi ở thời điểm chạy.
D. Khi muốn tạo ra một hệ thống phân cấp lớp phức tạp.
12. Trong lập trình hướng đối tượng, `coupling` (khớp nối) và `cohesion` (liên kết) là gì và mối quan hệ giữa chúng như thế nào?
A. Coupling và cohesion là hai khái niệm giống nhau, cần tối đa hóa cả hai.
B. Coupling là mức độ phụ thuộc giữa các module, cohesion là mức độ liên quan giữa các thành phần trong một module. Nên giảm coupling và tăng cohesion.
C. Coupling là mức độ liên quan trong một module, cohesion là mức độ phụ thuộc giữa các module. Nên tăng coupling và giảm cohesion.
D. Coupling và cohesion không liên quan đến nhau trong thiết kế OOP.
13. Nguyên tắc nào của lập trình hướng đối tượng cho phép một đối tượng che giấu thông tin chi tiết bên trong và chỉ hiển thị các chức năng cần thiết ra bên ngoài?
A. Tính kế thừa (Inheritance)
B. Tính đóng gói (Encapsulation)
C. Tính đa hình (Polymorphism)
D. Tính trừu tượng (Abstraction)
14. Phương thức `getter` và `setter` thường được sử dụng để làm gì trong OOP?
A. Xóa bỏ thuộc tính của đối tượng.
B. Truy cập và thay đổi giá trị của các thuộc tính `private` một cách có kiểm soát.
C. Tạo mới các đối tượng khác.
D. Thực hiện các phép tính toán học phức tạp.
15. Ví dụ nào sau đây thể hiện rõ nhất tính đa hình trong OOP?
A. Một class `Động vật` có các thuộc tính chung cho tất cả động vật.
B. Các lớp `Mèo` và `Chó` kế thừa từ lớp `Động vật` và cùng hiện thực phương thức `Kêu` nhưng với âm thanh khác nhau.
C. Một đối tượng `Mèo` có thể được gán cho biến kiểu `Động vật`.
D. Class `Mèo` có thể tái sử dụng mã từ class `Động vật`.
16. Thuộc tính `private` trong một lớp có ý nghĩa gì?
A. Có thể truy cập từ bất kỳ đâu trong chương trình.
B. Chỉ có thể truy cập từ bên trong class đó.
C. Có thể truy cập từ các lớp con.
D. Có thể truy cập từ các class trong cùng package.
17. Khái niệm `tính trừu tượng` (abstraction) trong OOP tập trung vào điều gì?
A. Hiện thực chi tiết của các đối tượng.
B. Che giấu sự phức tạp và chỉ hiển thị các đặc điểm cần thiết của đối tượng.
C. Tạo ra nhiều bản sao của đối tượng.
D. Thay đổi kiểu dữ liệu của đối tượng.
18. Nguyên tắc `SOLID` nào trong OOP tập trung vào việc một lớp chỉ nên có một lý do duy nhất để thay đổi?
A. Nguyên tắc duy nhất trách nhiệm (Single Responsibility Principle - SRP)
B. Nguyên tắc đóng mở (Open/Closed Principle - OCP)
C. Nguyên tắc thay thế Liskov (Liskov Substitution Principle - LSP)
D. Nguyên tắc phân tách Interface (Interface Segregation Principle - ISP)
19. 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 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 toàn cục trong chương trình.
20. Mẫu thiết kế `Factory` thuộc nhóm mẫu thiết kế nào?
A. Mẫu thiết kế cấu trúc (Structural patterns)
B. Mẫu thiết kế hành vi (Behavioral patterns)
C. Mẫu thiết kế tạo đối tượng (Creational patterns)
D. Mẫu thiết kế concurrency (Concurrency patterns)
21. Lỗi `NullPointerException` thường xảy ra khi nào trong lập trình hướng đối tượng?
A. Khi truy cập một biến cục bộ chưa đượ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 tham chiếu null.
C. Khi chia cho số 0.
D. Khi vượt quá giới hạn bộ nhớ.
22. Trong OOP, `đa hình` (polymorphism) nghĩa là gì?
A. Một đối tượng có nhiều thuộc tính.
B. Một phương thức có thể được định nghĩa lại ở các lớp con khác nhau để thực hiện các hành vi khác nhau.
C. Một lớp có thể kế thừa từ nhiều lớp cha.
D. Một đối tượng có thể thay đổi class của nó trong quá trình chạy.
23. Mẫu thiết kế `Singleton` đảm bảo điều gì?
A. Luôn có nhiều hơn một thể hiện của một class.
B. Chỉ có duy nhất một thể hiện của một class được tạo ra.
C. Thể hiện của class có thể thay đổi kiểu dữ liệu.
D. Tạo ra các đối tượng phức tạp từ các đối tượng đơn giản.
24. Đa kế thừa (multiple inheritance) là gì và nó có thể gây ra vấn đề gì?
A. Một lớp kế thừa từ một lớp cha duy nhất. Vấn đề: không có vấn đề.
B. Một lớp kế thừa từ nhiều lớp cha. Vấn đề: vấn đề `kim cương` (diamond problem) do xung đột tên và kế thừa từ các lớp cha chung.
C. Nhiều lớp kế thừa từ cùng một lớp cha. Vấn đề: quá tải bộ nhớ.
D. Không có lớp nào kế thừa từ lớp khác. Vấn đề: trùng lặp mã nguồn.
25. Nguyên tắc thay thế Liskov (LSP) phát biểu điều gì về mối quan hệ kế thừa?
A. Lớp con phải có ít chức năng hơn lớp cha.
B. Các đối tượng của lớp con phải có thể thay thế các đối tượng của lớp cha mà không làm thay đổi tính đúng đắn của chương trình.
C. Lớp cha phải biết về tất cả các lớp con của nó.
D. Không có mối quan hệ nào giữa lớp cha và lớp con.
26. Trong OOP, `interface` (giao diện) được sử dụng để làm gì?
A. Hiện thực hóa các phương thức cụ thể.
B. Định nghĩa một tập hợp các phương thức mà các lớp khác phải hiện thực hóa.
C. Tạo ra các đối tượng trực tiếp.
D. Che giấu hoàn toàn dữ liệu bên trong.
27. Nguyên tắc phân tách interface (ISP) giải quyết vấn đề gì?
A. Vấn đề một lớp có quá nhiều trách nhiệm.
B. Vấn đề một lớp phải hiện thực hóa các phương thức interface mà nó không sử dụng.
C. Vấn đề lớp con không thể thay thế lớp cha.
D. Vấn đề phụ thuộc chặt chẽ giữa các lớp.
28. Mối quan hệ `is-a` trong OOP thường được thể hiện thông qua cơ chế nào?
A. Đóng gói (Encapsulation)
B. Kế thừa (Inheritance)
C. Đa hình (Polymorphism)
D. Trừu tượng (Abstraction)
29. Trong ngữ cảnh của kế thừa, `lớp cha` còn được gọi là gì?
A. Lớp con (child class)
B. Lớp dẫn xuất (derived class)
C. Lớp cơ sở (base class) hoặc lớp siêu (superclass)
D. Lớp giao diện (interface class)
30. Nguyên tắc đảo ngược phụ thuộc (DIP) khuyến khích điều gì trong thiết kế phần mềm?
A. Các lớp cấp cao nên phụ thuộc vào các lớp cấp thấp.
B. Cả lớp cấp cao và lớp cấp thấp nên phụ thuộc vào trừu tượng (interfaces hoặc abstract classes).
C. Các trừu tượng không nên phụ thuộc vào chi tiết, chi tiết nên phụ thuộc vào trừu tượng.
D. Các lớp không nên phụ thuộc vào bất kỳ điều gì.