Trắc nghiệm Lập trình hướng đối tượng - Đề 07 bao gồm nhiều câu hỏi hay, bám sát chương trình. Cùng làm bài tập trắc nghiệm ngay.
Câu 1: Trong Lập trình hướng đối tượng (OOP), khái niệm nào mô tả việc nhóm dữ liệu (thuộc tính) và các phương thức (hành vi) làm việc trên dữ liệu đó vào một đơn vị duy nhất (ví dụ: một lớp), đồng thời kiểm soát quyền truy cập từ bên ngoài?
- A. Kế thừa (Inheritance)
- B. Đa hình (Polymorphism)
- C. Đóng gói (Encapsulation)
- D. Trừu tượng (Abstraction)
Câu 2: Khi thiết kế một hệ thống quản lý thư viện bằng OOP, bạn tạo một lớp `Sach` (Sách) và một lớp `TapChi` (Tạp chí). Cả hai đều có các thuộc tính chung như `TieuDe`, `SoLuongBanSao` và phương thức `HienThiThongTin()`. Khái niệm OOP nào cho phép bạn định nghĩa một lớp chung `AnPham` (Ấn phẩm) chứa các thuộc tính và phương thức chung này, sau đó để `Sach` và `TapChi` kế thừa từ đó?
- A. Kế thừa (Inheritance)
- B. Đa hình (Polymorphism)
- C. Đóng gói (Encapsulation)
- D. Trừu tượng (Abstraction)
Câu 3: Xét các lớp `HinhHoc` (lớp cha), `HinhTron` và `HinhVuong` (lớp con). Lớp `HinhHoc` có một phương thức ảo (virtual method) `TinhDienTich()`. Cả `HinhTron` và `HinhVuong` đều ghi đè (override) phương thức này để tính diện tích theo công thức riêng của chúng. Khi bạn có một danh sách các đối tượng kiểu `HinhHoc` (có thể là `HinhTron` hoặc `HinhVuong`), và gọi phương thức `TinhDienTich()` trên từng đối tượng, hệ thống sẽ tự động gọi phương thức `TinhDienTich()` phù hợp với kiểu thực tế của đối tượng đó tại thời điểm chạy. Hiện tượng này thể hiện tính chất nào của OOP?
- A. Kế thừa (Inheritance)
- B. Đa hình (Polymorphism)
- C. Đóng gói (Encapsulation)
- D. Trừu tượng (Abstraction)
Câu 4: Bạn đang thiết kế một hệ thống xử lý thanh toán trực tuyến. Có nhiều phương thức thanh toán khác nhau (thẻ tín dụng, PayPal, chuyển khoản ngân hàng). Mặc dù chi tiết xử lý mỗi phương thức là khác nhau, tất cả đều cần có các bước chung như `NhapThongTinThanhToan()`, `XacThucThanhToan()`, `GuiThongBao()`. Khái niệm OOP nào giúp bạn định nghĩa một giao diện chung hoặc lớp trừu tượng `PhuongThucThanhToan` để đảm bảo tất cả các phương thức cụ thể tuân theo một cấu trúc và hành vi nhất định mà không cần quan tâm đến chi tiết triển khai bên trong của từng phương thức?
- A. Kế thừa (Inheritance)
- B. Đa hình (Polymorphism)
- C. Đóng gói (Encapsulation)
- D. Trừu tượng (Abstraction)
Câu 5: Trong OOP, đâu là sự khác biệt cốt lõi giữa một `lớp` (Class) và một `đối tượng` (Object)?
- A. Lớp là một thể hiện cụ thể, còn đối tượng là bản thiết kế.
- B. Lớp là bản thiết kế (blueprint), còn đối tượng là một thể hiện (instance) cụ thể của lớp đó.
- C. Lớp chứa dữ liệu, còn đối tượng chứa phương thức.
- D. Lớp chỉ tồn tại trong mã nguồn, còn đối tượng chỉ tồn tại khi chương trình chạy.
Câu 6: Cho đoạn mã giả sau:
```
class Xe
protected string tenModel
public int soBanh
private string soKhung
public void HienThiThongTin()
// In tenModel, soBanh
private void KiemTraSoKhung()
// Kiem tra soKhung
class XeCon(inherits Xe)
// ...
```
Trong lớp `XeCon`, thành viên nào của lớp `Xe` có thể được truy cập trực tiếp?
- A. Chỉ `soKhung` và `KiemTraSoKhung()`
- B. Chỉ `tenModel` và `soKhung`
- C. Chỉ `soBanh` và `soKhung`
- D. Chỉ `tenModel`, `soBanh` và `HienThiThongTin()`
Câu 7: Trong một ngôn ngữ lập trình hỗ trợ OOP, đâu là mục đích chính của một phương thức khởi tạo (Constructor)?
- A. Để giải phóng bộ nhớ khi đối tượng không còn được sử dụng.
- B. Để thực hiện một hành động cụ thể sau khi đối tượng đã được tạo xong.
- C. Để khởi tạo trạng thái (thuộc tính) ban đầu cho một đối tượng khi nó được tạo ra.
- D. Để định nghĩa các phương thức mà lớp con phải triển khai.
Câu 8: Phân tích lợi ích chính của việc sử dụng tính đóng gói (Encapsulation) trong thiết kế phần mềm hướng đối tượng.
- A. Bảo vệ dữ liệu nội bộ của đối tượng, giúp kiểm soát cách dữ liệu được truy cập và sửa đổi, từ đó tăng tính an toàn và dễ bảo trì.
- B. Cho phép một đối tượng có nhiều hình thức khác nhau tại thời điểm chạy.
- C. Giúp tái sử dụng mã nguồn bằng cách tạo các lớp mới từ các lớp hiện có.
- D. Giúp tập trung vào các đặc điểm cốt lõi và bỏ qua chi tiết không cần thiết.
Câu 9: Giả sử bạn có một lớp `DongVat` (động vật) và các lớp con như `Cho`, `Meo`, `Bo` kế thừa từ `DongVat`. Lớp `DongVat` có phương thức `Keu()`. Mỗi lớp con ghi đè phương thức `Keu()` để phát ra âm thanh đặc trưng của loài đó ("Gau gau", "Meo meo", "O o"). Khi bạn có một mảng các đối tượng kiểu `DongVat` chứa cả `Cho`, `Meo`, `Bo` và lặp qua mảng để gọi `Keu()` trên từng đối tượng, kết quả là mỗi đối tượng sẽ kêu đúng theo loài của nó. Đây là ví dụ cụ thể nhất cho tính chất nào của OOP?
- A. Kế thừa (Inheritance)
- B. Đa hình (Polymorphism)
- C. Đóng gói (Encapsulation)
- D. Trừu tượng (Abstraction)
Câu 10: Trong một số ngôn ngữ OOP, bạn có thể định nghĩa nhiều phương thức cùng tên trong một lớp, miễn là chúng có danh sách tham số khác nhau (số lượng, kiểu hoặc thứ tự tham số). Khái niệm này được gọi là gì?
- A. Nạp chồng phương thức (Method Overloading)
- B. Ghi đè phương thức (Method Overriding)
- C. Kế thừa đa cấp (Multilevel Inheritance)
- D. Đóng gói dữ liệu (Data Encapsulation)
Câu 11: Một lớp trừu tượng (Abstract Class) trong OOP:
- A. Chỉ có thể chứa các phương thức trừu tượng (abstract methods).
- B. Có thể tạo ra các đối tượng trực tiếp từ nó.
- C. Không thể có bất kỳ phương thức cụ thể (concrete methods) nào.
- D. Không thể tạo ra các đối tượng trực tiếp từ nó và thường chứa ít nhất một phương thức trừu tượng mà các lớp con phải triển khai.
Câu 12: Giao diện (Interface) trong OOP chủ yếu dùng để:
- A. Định nghĩa một lớp cơ sở để các lớp khác kế thừa thuộc tính và phương thức.
- B. Định nghĩa một bộ các phương thức mà một lớp phải triển khai, tạo ra một "hợp đồng" về hành vi.
- C. Che giấu dữ liệu nội bộ của một đối tượng.
- D. Cung cấp một khuôn mẫu cho việc tạo đối tượng với trạng thái ban đầu.
Câu 13: Phân biệt giữa Kế thừa (Inheritance) và Thành phần hóa (Composition) trong OOP.
- A. Kế thừa mô tả mối quan hệ "là một loại của" (is-a), còn Thành phần hóa mô tả mối quan hệ "có một" (has-a).
- B. Kế thừa giúp tái sử dụng mã, còn Thành phần hóa thì không.
- C. Kế thừa là một dạng của Đa hình, còn Thành phần hóa là một dạng của Đóng gói.
- D. Kế thừa áp dụng cho các lớp con, còn Thành phần hóa áp dụng cho các giao diện.
Câu 14: Trong ngôn ngữ C#, từ khóa nào được sử dụng để chỉ ra rằng một phương thức trong lớp con sẽ cung cấp một triển khai cụ thể cho một phương thức ảo (virtual) hoặc trừu tượng (abstract) đã được định nghĩa trong lớp cha?
- A. virtual
- B. override
- C. abstract
- D. new
Câu 15: Đâu là nhược điểm tiềm tàng của việc lạm dụng tính kế thừa trong thiết kế OOP?
- A. Làm giảm khả năng tái sử dụng mã.
- B. Làm cho chương trình khó biên dịch hơn.
- C. Tạo ra sự ràng buộc chặt chẽ giữa lớp cha và lớp con (tight coupling), có thể gây khó khăn khi thay đổi hoặc mở rộng hệ thống.
- D. Làm tăng đáng kể dung lượng bộ nhớ chương trình.
Câu 16: Xem xét đoạn mã giả sau:
```
class MayTinh {
public void KhoiDong() { print
- A. May tinh khoi dong
- B. Laptop dang bat nguon
- C. Lỗi biên dịch
- D. Cả hai dòng sẽ được in ra
Câu 17: Giả sử bạn có một lớp `NhanVien` với các thuộc tính `MaNhanVien`, `Ten`, `LuongCoBan`. Bạn muốn tạo các lớp con `NhanVienFullTime` và `NhanVienPartTime`, mỗi lớp có cách tính lương khác nhau nhưng vẫn kế thừa các thuộc tính chung. Để đảm bảo mọi `NhanVien` đều có một phương thức `TinhLuong()`, nhưng việc tính toán cụ thể được thực hiện ở lớp con, bạn nên định nghĩa `TinhLuong()` trong lớp `NhanVien` như thế nào?
- A. Là một phương thức trừu tượng (abstract) hoặc phương thức ảo (virtual).
- B. Là một phương thức private.
- C. Là một thuộc tính (property).
- D. Không cần định nghĩa trong lớp `NhanVien`, chỉ cần định nghĩa ở các lớp con.
Câu 18: Khi nào thì nên ưu tiên sử dụng Thành phần hóa (Composition) thay vì Kế thừa (Inheritance)?
- A. Khi bạn muốn mô hình hóa mối quan hệ "là một loại của" (is-a).
- B. Khi bạn muốn mô hình hóa mối quan hệ "có một" (has-a) và cần sự linh hoạt trong việc thay đổi hành vi thành phần.
- C. Khi bạn muốn tái sử dụng mã nguồn từ nhiều lớp khác nhau mà ngôn ngữ không hỗ trợ đa kế thừa.
- D. Khi lớp con cần truy cập trực tiếp vào các thành viên private của lớp cha.
Câu 19: Giả sử bạn đang phát triển một ứng dụng vẽ đồ họa. Bạn có một lớp `HinhDang` (Shape) và các lớp con như `DuongThang`, `HinhChuNhat`, `HinhTron`. Mỗi lớp con cần có khả năng lưu/tải trạng thái của nó từ/đến một tệp. Thay vì thêm phương thức `Luu()` và `Tai()` vào lớp `HinhDang` và ghi đè ở lớp con, bạn quyết định tạo một giao diện `ILuuTru` (ISavable) với hai phương thức `LuuVaoTep(string tenTep)` và `TaiTuTep(string tenTep)`. Các lớp `DuongThang`, `HinhChuNhat`, `HinhTron` sau đó sẽ triển khai giao diện này. Cách tiếp cận này thể hiện việc sử dụng giao diện để đạt được điều gì?
- A. Giúp các lớp con kế thừa dữ liệu từ lớp cha.
- B. Buộc các lớp con phải có cùng cách triển khai phương thức `Luu()` và `Tai()`.
- C. Hạn chế truy cập vào các thuộc tính nội bộ của lớp.
- D. Định nghĩa một khả năng (saving/loading) mà nhiều lớp khác nhau có thể có, bất kể vị trí của chúng trong cây kế thừa.
Câu 20: Trong ngữ cảnh của Đa hình (Polymorphism), "đa hình lúc biên dịch" (Compile-time Polymorphism) thường được thực hiện thông qua kỹ thuật nào?
- A. Nạp chồng phương thức (Method Overloading)
- B. Ghi đè phương thức (Method Overriding)
- C. Kế thừa (Inheritance)
- D. Trừu tượng hóa dữ liệu (Data Abstraction)
Câu 21: Phân tích lý do tại sao Lập trình hướng đối tượng được cho là giúp tăng khả năng tái sử dụng mã nguồn.
- A. Vì mọi thứ đều được đóng gói trong các đối tượng riêng biệt.
- B. Vì nó sử dụng các phương thức trừu tượng và giao diện.
- C. Thông qua tính kế thừa, cho phép lớp con sử dụng lại thuộc tính và phương thức của lớp cha, và tính thành phần hóa, cho phép một lớp sử dụng các đối tượng của lớp khác.
- D. Vì nó cho phép định nghĩa nhiều phương thức cùng tên (đa hình).
Câu 22: Khi nào thì một lớp nên được khai báo là `sealed` (trong C#) hoặc `final` (trong Java)?
- A. Khi lớp đó chỉ chứa các phương thức trừu tượng.
- B. Khi bạn muốn ngăn chặn các lớp khác kế thừa từ lớp này.
- C. Khi lớp đó cần được tạo ra nhiều đối tượng.
- D. Khi lớp đó triển khai một giao diện.
Câu 23: Trong thiết kế OOP, mối quan hệ nào được thể hiện bằng cụm từ "một phần của" (part-of), trong đó đối tượng thành phần không thể tồn tại độc lập nếu đối tượng chứa nó bị phá hủy? (Ví dụ: các Bánh xe là một phần của Chiếc xe hơi, nếu Chiếc xe hơi bị phá hủy thì các Bánh xe đó cũng không còn ý nghĩa tồn tại trong ngữ cảnh đó).
- A. Thành phần hóa chặt (Composition)
- B. Tổng hợp (Aggregation)
- C. Kế thừa (Inheritance)
- D. Hiệp hội (Association)
Câu 24: Xem xét đoạn mã giả sau:
```
class DongHo {
private int gio, phut, giay;
// Constructor 1
public DongHo(int h, int m, int s) { ... }
// Constructor 2
public DongHo(int h, int m) { ... }
// Constructor 3
public DongHo(int h) { ... }
}
```
Ví dụ trên thể hiện tính chất nào của OOP?
- A. Ghi đè phương thức (Method Overriding)
- B. Nạp chồng (Overloading)
- C. Kế thừa (Inheritance)
- D. Đa hình lúc chạy (Runtime Polymorphism)
Câu 25: Trong một số ngôn ngữ OOP, phương thức nào được gọi tự động khi một đối tượng không còn được sử dụng và bộ nhớ nó chiếm giữ sắp được giải phóng?
- A. Constructor
- B. Main method
- C. Destructor (hoặc Finalizer)
- D. Static method
Câu 26: Phân tích sự khác biệt chính giữa Đa hình lúc biên dịch (Compile-time Polymorphism) và Đa hình lúc chạy (Runtime Polymorphism).
- A. Đa hình lúc biên dịch được quyết định tại thời điểm biên dịch (thường qua nạp chồng), còn đa hình lúc chạy được quyết định tại thời điểm thực thi (thường qua ghi đè).
- B. Đa hình lúc biên dịch áp dụng cho phương thức, còn đa hình lúc chạy áp dụng cho thuộc tính.
- C. Đa hình lúc biên dịch yêu cầu kế thừa, còn đa hình lúc chạy thì không.
- D. Đa hình lúc biên dịch sử dụng từ khóa `virtual`, còn đa hình lúc chạy sử dụng từ khóa `static`.
Câu 27: Bạn đang thiết kế một hệ thống cho phép người dùng nhập các loại dữ liệu khác nhau (số nguyên, chuỗi, ngày tháng) và hiển thị chúng. Để xử lý việc hiển thị một cách linh hoạt, bạn tạo một phương thức `HienThi(object data)`. Khi gọi phương thức này, bạn muốn hành vi hiển thị phụ thuộc vào kiểu dữ liệu thực tế của `data` (ví dụ: hiển thị số nguyên khác với hiển thị chuỗi). Tính chất OOP nào giúp bạn đạt được điều này một cách hiệu quả?
- A. Đóng gói (Encapsulation)
- B. Kế thừa (Inheritance)
- C. Trừu tượng (Abstraction)
- D. Đa hình (Polymorphism)
Câu 28: Trong OOP, đâu là mục đích chính của việc sử dụng các phạm vi truy cập (access modifiers) như `public`, `private`, `protected`?
- A. Kiểm soát quyền truy cập vào các thành viên của lớp từ bên ngoài, hỗ trợ tính đóng gói.
- B. Xác định thứ tự thực thi của các phương thức trong lớp.
- C. Định nghĩa các phương thức có thể được ghi đè bởi lớp con.
- D. Ngăn chặn việc tạo đối tượng trực tiếp từ lớp.
Câu 29: Phân tích ưu điểm của Lập trình hướng đối tượng so với Lập trình hướng cấu trúc (Procedural Programming).
- A. Lập trình hướng đối tượng thường tạo ra các chương trình có kích thước nhỏ hơn.
- B. Lập trình hướng đối tượng giúp quản lý sự phức tạp tốt hơn, tăng khả năng tái sử dụng, dễ bảo trì và mở rộng hệ thống.
- C. Lập trình hướng đối tượng thực thi nhanh hơn vì gần với mã máy hơn.
- D. Lập trình hướng đối tượng chỉ sử dụng các kiểu dữ liệu cơ bản.
Câu 30: Trong một hệ thống kế thừa đa cấp (ví dụ: `DongVat` -> `Chim` -> `ChimCanhCut`), nếu lớp `ChimCanhCut` muốn gọi một phương thức đã được định nghĩa trong lớp `DongVat` (lớp ông), nhưng đã bị ghi đè bởi lớp `Chim` (lớp cha), bạn sẽ sử dụng từ khóa nào (trong C# hoặc Java) để truy cập phiên bản của lớp cha trực tiếp (`Chim`)?
- A. this
- B. root
- C. base (C#) / super (Java)
- D. parent