1. Trong lập trình hướng đối tượng, `dependency injection` (tiêm phụ thuộc) là gì?
A. Một kỹ thuật để giảm sự phụ thuộc giữa các lớp bằng cách cung cấp các phụ thuộc của một lớp từ bên ngoài.
B. Một kỹ thuật để tăng sự phụ thuộc giữa các lớp.
C. Một kỹ thuật để ẩn dữ liệu bên trong một lớp.
D. Một kỹ thuật để tối ưu hóa hiệu suất của chương trình.
2. Trong lập trình hướng đối tượng, `tính trừu tượng` (abstraction) đề cập đến điều gì?
A. Việc tạo ra các đối tượng phức tạp từ các đối tượng đơn giản.
B. Việc che giấu các chi tiết triển khai phức tạp và chỉ hiển thị các thông tin cần thiết.
C. Việc sử dụng các biến toàn cục thay vì các biến cục bộ.
D. Việc tối ưu hóa hiệu suất của chương trình.
3. Nguyên tắc `Dependency Inversion Principle` (DIP) trong lập trình hướng đối tượng nói về điều gì?
A. Một lớp chỉ nên có một lý do để thay đổi.
B. Một lớp nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con nên có thể thay thế cho các lớp cha của chúng.
D. Các module cấp cao không nên phụ thuộc vào các module cấp thấp; cả hai nên phụ thuộc vào các abstraction (trừu tượng).
4. Phương thức nào sau đây được sử dụng để khởi tạo 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 getter.
C. Phương thức setter.
D. Phương thức khởi tạo (constructor).
5. Nguyên tắc `Interface Segregation Principle` (ISP) trong lập trình hướng đối tượng nói về điều gì?
A. Một lớp chỉ nên có một lý do để thay đổi.
B. Một lớp nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con nên có thể thay thế cho các lớp cha của chúng.
D. Không nên ép buộc các lớp phải triển khai các phương thức mà chúng không sử dụng; nên chia các interface lớn thành các interface nhỏ hơn, cụ thể hơn.
6. Trong lập trình hướng đối tượng, `coupling` (tính liên kết) đề cập đến điều gì?
A. Mức độ các phần tử bên trong một module liên quan đến nhau.
B. Mức độ các module khác nhau phụ thuộc vào nhau.
C. Mức độ code dễ đọc và dễ hiểu.
D. Mức độ code có thể tái sử dụng.
7. Trong lập trình hướng đối tượng, `static method` (phương thức tĩnh) là gì?
A. Một phương thức chỉ có thể được gọi trên một đối tượng cụ thể của lớp.
B. Một phương thức có thể truy cập các biến instance của lớp.
C. Một phương thức thuộc về lớp chứ không phải đối tượng, và có thể được gọi trực tiếp trên lớp.
D. Một phương thức chỉ có thể được gọi một lần.
8. Trong lập trình hướng đối tượng, `tính đóng gói` (encapsulation) đề cập đến điều gì?
A. Khả năng một đối tượng có nhiều hình thức khác nhau.
B. Cơ chế cho phép một lớp kế thừa các thuộc tính và phương thức từ một lớp khác.
C. Việc che giấu thông tin và trạng thái bên trong của một đối tượng và chỉ cho phép truy cập thông qua các phương thức.
D. Khả năng một đối tượng tự động giải phóng bộ nhớ khi không còn được sử dụng.
9. Trong lập trình hướng đối tượng, `aggregation` (tập hợp) là gì?
A. Một loại của inheritance (kế thừa).
B. Một dạng của polymorphism (đa hình).
C. Một dạng của association (kết hợp) trong đó một lớp chứa các đối tượng của lớp khác, nhưng các đối tượng này có thể tồn tại độc lập.
D. Một dạng của encapsulation (đóng gói).
10. Lợi ích chính 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 độ thực thi chương trình.
B. Giảm kích thước code.
C. Cung cấp các giải pháp đã được chứng minh cho các vấn đề thiết kế phần mềm thường gặp.
D. Loại bỏ sự cần thiết phải kiểm thử code.
11. Nguyên tắc `Liskov Substitution Principle` (LSP) trong lập trình hướng đối tượng nói về điều gì?
A. Một lớp chỉ nên có một lý do để thay đổi.
B. Một lớp nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con nên có thể thay thế cho các lớp cha của chúng mà không làm thay đổi tính đúng đắn của chương trình.
D. Không nên ép buộc các lớp phải triển khai các phương thức mà chúng không sử dụng.
12. Trong lập trình hướng đối tượng, `association` (kết hợp) giữa hai lớp có nghĩa là gì?
A. Một lớp là một loại của lớp khác.
B. Một lớp chứa các đối tượng của lớp khác.
C. Hai lớp có mối quan hệ với nhau, nhưng không có sự sở hữu hoặc phụ thuộc mạnh mẽ.
D. Một lớp phụ thuộc hoàn toàn vào lớp khác.
13. Trong lập trình hướng đối tượng, `interface` (giao diện) được sử dụng để làm gì?
A. Để tạo ra các đối tượng có giao diện người dùng đồ họa.
B. Để định nghĩa một tập hợp các phương thức mà một lớp phải triển khai.
C. Để bảo vệ dữ liệu khỏi bị truy cập trái phép.
D. Để tối ưu hóa hiệu suất của chương trình.
14. Điều gì KHÔNG phải là một lợi ích của việc sử dụng lập trình hướng đối tượng?
A. Tái sử dụng code
B. Dễ bảo trì và mở rộng
C. Giảm độ phức tạp của code
D. Luôn luôn tăng hiệu suất thực thi so với lập trình hướng cấu trúc.
15. Trong lập trình hướng đối tượng, một `lớp` (class) được hiểu là gì?
A. Một thể hiện cụ thể của một đối tượng.
B. Một kiểu dữ liệu nguyên thủy (primitive data type).
C. Một bản thiết kế hoặc khuôn mẫu để tạo ra các đối tượng.
D. Một hàm (function) dùng để thực hiện một tác vụ cụ thể.
16. Đ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 bị xóa bỏ.
B. Phương thức của lớp con được gọi thay vì phương thức của lớp cha khi phương thức đó được gọi trên một đối tượng của lớp con.
C. Phương thức của lớp cha và lớp con được gọi đồng thời.
D. Một lỗi biên dịch xảy ra.
17. Nguyên tắc `Single Responsibility Principle` (SRP) trong lập trình hướng đối tượng nói về điều gì?
A. Một lớp chỉ nên có một lý do để thay đổi.
B. Một lớp nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con nên có thể thay thế cho các lớp cha của chúng.
D. Không nên ép buộc các lớp phải triển khai các phương thức mà chúng không sử dụng.
18. Phương thức nào sau đây KHÔNG phải là một phương pháp tiếp cận để thực hiện tính đa hình (polymorphism) trong lập trình hướng đối tượng?
A. Method Overloading (Nạp chồng phương thức)
B. Method Overriding (Ghi đè phương thức)
C. Templates (Mẫu)
D. Data hiding (Ẩn dữ liệu)
19. Khi nào nên sử dụng `composition` (hợp thành) thay vì `inheritance` (kế thừa) trong lập trình hướng đối tượng?
A. Khi muốn tái sử dụng code từ một lớp khác.
B. Khi một lớp là một `loại` của lớp khác (is-a relationship).
C. Khi một lớp `có một` lớp khác (has-a relationship) và vòng đời của lớp `có` phụ thuộc vào lớp chứa nó.
D. Khi muốn thực hiện tính đa hình.
20. Phương pháp nào sau đây thể hiện rõ nhất tính kế thừa (inheritance) trong lập trình hướng đối tượng?
A. Một lớp có thể chứa nhiều đối tượng khác nhau.
B. Một đối tượng có thể thay đổi kiểu dữ liệu của nó trong quá trình thực thi.
C. Một lớp con (subclass) kế thừa các thuộc tính và phương thức từ lớp cha (superclass).
D. Một phương thức có thể được gọi với các tham số khác nhau.
21. Đặc điểm nào sau đây KHÔNG phải là một lợi ích chính của lập trình hướng đối tượng (OOP)?
A. Tính đóng gói (Encapsulation)
B. Tính kế thừa (Inheritance)
C. Tính đa hình (Polymorphism)
D. Tăng tốc độ thực thi chương trình
22. Điều gì KHÔNG phải là một nguyên tắc cơ bản của lập trình hướng đối tượng?
A. Đóng gói (Encapsulation)
B. Kế thừa (Inheritance)
C. Đa hình (Polymorphism)
D. Lập trình hàm (Functional programming)
23. Trong lập trình hướng đối tượng, `method overloading` (nạp chồng phương thức) là gì?
A. Việc định nghĩa nhiều phương thức có cùng tên nhưng khác tham số trong cùng một lớp.
B. Việc ghi đè một phương thức của lớp cha trong lớp con.
C. Việc tạo ra một đối tượng từ một lớp.
D. Việc ẩn dữ liệu bên trong một lớp.
24. Một `đối tượng` (object) trong lập trình hướng đối tượng là gì?
A. Một bản thiết kế hoặc khuôn mẫu để tạo ra các lớp.
B. Một kiểu dữ liệu trừu tượng.
C. Một thể hiện cụ thể của một lớp.
D. Một phương thức tĩnh (static method).
25. Trong lập trình hướng đối tượng, `composition` (hợp thành) là gì?
A. Một loại của interface (giao diện).
B. Một dạng của abstraction (trừu tượng).
C. Một dạng của association (kết hợp) trong đó một lớp chứa các đối tượng của lớp khác, và các đối tượng này không thể tồn tại nếu lớp chứa chúng bị hủy.
D. Một dạng của encapsulation (đóng gói).
26. Sự khác biệt chính giữa `abstract class` (lớp trừu tượng) và `interface` (giao diện) là gì?
A. Abstract class không thể chứa các phương thức trừu tượng.
B. Interface có thể chứa các thuộc tính.
C. Một lớp có thể kế thừa từ nhiều abstract class.
D. Một lớp có thể triển khai nhiều interface, nhưng chỉ có thể kế thừa từ một abstract class.
27. Trong lập trình hướng đối tượng, `cohesion` (tính gắn kết) đề cập đến điều gì?
A. Mức độ các phần tử bên trong một module liên quan đến nhau.
B. Mức độ các module khác nhau phụ thuộc vào nhau.
C. Mức độ code dễ đọc và dễ hiểu.
D. Mức độ code có thể tái sử dụng.
28. Nguyên tắc `Open/Closed Principle` (OCP) trong lập trình hướng đối tượng nói về điều gì?
A. Một lớp chỉ nên có một lý do để thay đổi.
B. Một lớp nên mở để mở rộng nhưng đóng để sửa đổi.
C. Các lớp con nên có thể thay thế cho các lớp cha của chúng.
D. Không nên ép buộc các lớp phải triển khai các phương thức mà chúng không sử dụng.
29. Trong ngữ cảnh của lập trình hướng đối tượng, `đa hình` (polymorphism) có nghĩa là gì?
A. Khả năng tạo ra nhiều đối tượng từ một lớp duy nhất.
B. Khả năng một đối tượng thuộc nhiều lớp khác nhau.
C. Khả năng một đối tượng có nhiều thuộc tính khác nhau.
D. Khả năng một đối tượng có thể thể hiện nhiều hình thức khác nhau hoặc một phương thức có thể hoạt động khác nhau tùy thuộc vào đối tượng gọi nó.
30. Trong lập trình hướng đối tượng, mục đích của việc sử dụng `access modifiers` (các công cụ sửa đổi truy cập) như `private`, `protected` và `public` là gì?
A. Để tối ưu hóa hiệu suất của chương trình.
B. Để kiểm soát quyền truy cập vào các thành viên của một lớp.
C. Để tạo ra các đối tượng có giao diện người dùng đồ họa.
D. Để đơn giản hóa quá trình gỡ lỗi.