Bài Tập, Đề Thi Trắc Nghiệm Online - Môn Java - Đề 03 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 Java, phát biểu nào sau đây mô tả đúng nhất về tính đóng gói (encapsulation)?
- A. Tính đóng gói 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.
- B. Tính đóng gói là cơ chế ẩn giấu thông tin và bảo vệ dữ liệu của đối tượng khỏi sự truy cập trực tiếp từ bên ngoài, chỉ cho phép truy cập thông qua các phương thức công khai.
- C. Tính đóng gói giúp tạo ra các đối tượng có nhiều hình thái khác nhau dựa trên lớp cha của chúng.
- D. Tính đóng gói là 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.
Câu 2: Xem xét đoạn mã Java sau:
```java
public class Vehicle {
protected String modelName =
- A. Đóng gói (Encapsulation)
- B. Trừu tượng hóa (Abstraction)
- C. Đa hình (Polymorphism)
- D. Kế thừa (Inheritance)
Câu 3: Trong Java, khi nào thì Garbage Collector (Bộ thu gom rác) tự động dọn dẹp bộ nhớ?
- A. Khi chương trình Java kết thúc.
- B. Khi không còn tham chiếu nào đến một đối tượng trong bộ nhớ heap.
- C. Khi bộ nhớ stack bị đầy.
- D. Garbage Collector chỉ chạy khi được gọi явно bởi lập trình viên.
Câu 4: Phương thức `equals()` và toán tử `==` trong Java khác nhau như thế nào khi so sánh các đối tượng (Objects)?
- A. Cả `equals()` và `==` đều so sánh giá trị của đối tượng.
- B. Cả `equals()` và `==` đều so sánh tham chiếu của đối tượng.
- C. `equals()` so sánh tham chiếu, còn `==` so sánh giá trị của đối tượng.
- D. `equals()` thường được ghi đè để so sánh nội dung của đối tượng, trong khi `==` so sánh tham chiếu (vị trí bộ nhớ) của hai đối tượng.
Câu 5: Cho đoạn code Java sau:
```java
String str1 = new String(
- A. true
true
true
true
- B. false
false
true
true
- C. false
true
true
true
- D. true
false
false
true
Câu 6: Interface và Abstract Class trong Java có điểm gì khác biệt cơ bản?
- A. Một lớp có thể implements nhiều interface nhưng chỉ có thể kế thừa từ một abstract class.
- B. Abstract class không thể chứa phương thức trừu tượng, trong khi interface thì có thể.
- C. Interface có thể có các biến instance, abstract class thì không.
- D. Abstract class nhanh hơn interface về hiệu năng thực thi.
Câu 7: Trong Java, exception (ngoại lệ) Checked và Unchecked khác nhau như thế nào? Cho ví dụ về mỗi loại.
- A. Checked exceptions xảy ra khi lỗi cú pháp, Unchecked exceptions xảy ra khi lỗi logic.
- B. Checked exceptions phải được xử lý bằng try-catch hoặc throws, ví dụ: IOException. Unchecked exceptions không bắt buộc phải xử lý, ví dụ: NullPointerException.
- C. Checked exceptions được xử lý bởi JVM, Unchecked exceptions phải được xử lý bởi lập trình viên.
- D. Checked exceptions xảy ra trong thời gian biên dịch, Unchecked exceptions xảy ra trong thời gian chạy.
Câu 8: Hãy giải thích ngắn gọn về nguyên tắc SOLID "L" - Liskov Substitution Principle (Nguyên tắc thay thế Liskov) trong lập trình hướng đối tượng.
- A. Các lớp nên có một và chỉ một lý do để thay đổi.
- B. 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.
- C. Nhiều interface đặc thù tốt hơn là một interface đa năng.
- D. Các lớp con của một lớp cha phải có khả năng thay thế lớp cha của chúng mà không làm thay đổi tính chính xác của chương trình.
Câu 9: Vòng lặp `for-each` (enhanced for loop) trong Java được sử dụng để làm gì và nó có thể được sử dụng với những loại cấu trúc dữ liệu nào?
- A. Để lặp lại một khối mã với số lần xác định trước dựa trên điều kiện.
- B. Để tạo ra một vòng lặp vô hạn.
- C. Để duyệt qua tất cả các phần tử của một mảng hoặc Collection (ví dụ: List, Set).
- D. Để thực hiện các thao tác song song trên các phần tử của mảng.
Câu 10: Sự khác biệt chính giữa `ArrayList` và `LinkedList` trong Java Collections Framework là gì? Khi nào nên sử dụng `ArrayList` thay vì `LinkedList` và ngược lại?
- A. `ArrayList` sử dụng bộ nhớ hiệu quả hơn `LinkedList`.
- B. `ArrayList` dựa trên mảng động, cho phép truy cập phần tử nhanh (theo index) nhưng chậm khi chèn/xóa ở đầu/giữa. `LinkedList` dựa trên danh sách liên kết, chèn/xóa nhanh nhưng truy cập phần tử chậm hơn.
- C. `ArrayList` có thể chứa các phần tử trùng lặp, `LinkedList` thì không.
- D. `LinkedList` hỗ trợ đa luồng tốt hơn `ArrayList`.
Câu 11: Giải thích khái niệm "Autoboxing" và "Unboxing" trong Java. Tại sao chúng được giới thiệu?
- A. Autoboxing là quá trình chuyển đổi kiểu dữ liệu nguyên thủy thành String, Unboxing là ngược lại.
- B. Autoboxing là quá trình tự động kiểm tra lỗi biên dịch, Unboxing là quá trình bỏ qua kiểm tra lỗi.
- C. Autoboxing và Unboxing là cơ chế quản lý bộ nhớ tự động trong Java.
- D. Autoboxing là tự động chuyển đổi từ kiểu nguyên thủy (primitive) sang wrapper class tương ứng (ví dụ: int sang Integer), Unboxing là ngược lại. Chúng giúp đơn giản hóa việc sử dụng kiểu nguyên thủy với các Collections và API hướng đối tượng.
Câu 12: Từ khóa `static` trong Java được sử dụng để làm gì? Hãy nêu các trường hợp sử dụng phổ biến của `static`.
- A. Từ khóa `static` được sử dụng để tạo ra các thành viên của lớp (biến và phương thức) thuộc về lớp chứ không phải là đối tượng cụ thể của lớp. Sử dụng phổ biến cho biến đếm chung, phương thức tiện ích, và block khởi tạo tĩnh.
- B. Từ khóa `static` dùng để khai báo hằng số trong Java.
- C. Từ khóa `static` dùng để ngăn chặn việc kế thừa lớp.
- D. Từ khóa `static` dùng để khai báo các biến toàn cục trong Java.
Câu 13: Phương thức `finalize()` trong Java có vai trò gì? Có nên tin cậy vào `finalize()` để giải phóng tài nguyên hay không? Tại sao?
- A. Phương thức `finalize()` được gọi ngay sau khi một đối tượng được tạo ra.
- B. Phương thức `finalize()` được sử dụng để giải phóng bộ nhớ ngay khi đối tượng không còn dùng nữa.
- C. Phương thức `finalize()` được gọi bởi Garbage Collector trước khi thu hồi bộ nhớ của một đối tượng. Không nên tin cậy vào `finalize()` để giải phóng tài nguyên quan trọng vì thời điểm gọi không được đảm bảo và có thể không được gọi trong một số trường hợp. Nên sử dụng try-with-resources hoặc các cơ chế quản lý tài nguyên явное khác.
- D. Phương thức `finalize()` là một phương thức tĩnh (static) và được gọi khi lớp được tải.
Câu 14: Đoạn code sau có lỗi không? Nếu có, lỗi gì và làm sao để sửa?
```java
public class Calculation {
public static void main(String[] args) {
int result = divide(10, 0);
System.out.println(
- A. Không có lỗi. Đoạn code sẽ in ra
- B. Có lỗi `ArithmeticException` vì chia cho 0 trong phương thức `divide()`. Để sửa, cần thêm xử lý ngoại lệ (try-catch) hoặc kiểm tra giá trị của `b` trước khi thực hiện phép chia.
- C. Lỗi biên dịch vì phương thức `divide()` không phải là static.
- D. Lỗi kiểu dữ liệu vì `result` được khai báo là int nhưng phép chia có thể trả về số thực.
Câu 15: Trong Java, Serialization là gì và nó dùng để làm gì? Khi nào cần sử dụng Serialization?
- A. Serialization là quá trình mã hóa dữ liệu để bảo mật thông tin.
- B. Serialization là quá trình chuyển đổi mã nguồn Java sang bytecode.
- C. Serialization là quá trình tối ưu hóa hiệu suất của ứng dụng Java.
- D. Serialization là quá trình chuyển đổi một đối tượng Java thành một luồng byte để có thể lưu trữ xuống file hoặc truyền qua mạng. Sử dụng khi cần lưu trữ trạng thái của đối tượng hoặc truyền đối tượng giữa các ứng dụng Java (ví dụ: RMI, web services).
Câu 16: Hãy so sánh `StringBuilder` và `StringBuffer` trong Java. Khi nào nên dùng `StringBuilder` và khi nào nên dùng `StringBuffer`?
- A. `StringBuffer` nhanh hơn `StringBuilder` trong hầu hết các trường hợp.
- B. Không có sự khác biệt về chức năng giữa `StringBuilder` và `StringBuffer`, chỉ khác nhau về tên.
- C. Cả `StringBuilder` và `StringBuffer` đều dùng để tạo và thao tác chuỗi động. `StringBuffer` là thread-safe (synchronized) nên an toàn trong môi trường đa luồng nhưng chậm hơn. `StringBuilder` không thread-safe nên nhanh hơn và thường được dùng trong môi trường đơn luồng.
- D. `StringBuilder` chỉ dùng để đọc chuỗi, `StringBuffer` dùng để ghi chuỗi.
Câu 17: Đoạn code sau in ra kết quả gì?
```java
public class LoopTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
continue;
}
System.out.print(i +
- A. 0 1 2 3 4
- B. 0 1 2 4
- C. 0 1 2
- D. 0 1 2 3 4 5
Câu 18: Trong Java, "method overloading" và "method overriding" là gì? Phân biệt hai khái niệm này.
- A. Method overloading và overriding là hai tên gọi khác nhau của cùng một khái niệm.
- B. Method overloading xảy ra khi một lớp con định nghĩa lại một phương thức của lớp cha, method overriding là ngược lại.
- C. Method overloading là việc sử dụng lại tên phương thức đã có trong interface, method overriding là trong abstract class.
- D. Method overloading (nạp chồng phương thức) là việc định nghĩa nhiều phương thức cùng tên nhưng khác nhau về tham số trong cùng một lớp. Method overriding (ghi đè phương thức) là việc lớp con định nghĩa lại một phương thức đã có của lớp cha với cùng tên và cùng kiểu tham số.
Câu 19: Java Virtual Machine (JVM) có vai trò gì trong việc thực thi chương trình Java?
- A. JVM là trình biên dịch mã nguồn Java sang bytecode.
- B. JVM là một hệ điều hành đặc biệt để chạy các ứng dụng Java.
- C. JVM là môi trường thực thi bytecode Java. Nó biên dịch bytecode sang mã máy, quản lý bộ nhớ (Garbage Collection), và cung cấp tính độc lập nền tảng (platform-independent) cho Java.
- D. JVM là một công cụ để debug chương trình Java.
Câu 20: Hãy giải thích về "constructor" trong Java. Constructor có những đặc điểm gì và vai trò của nó là gì?
- A. Constructor là một phương thức thông thường trong Java, được sử dụng để thực hiện các phép tính.
- B. Constructor là một phương thức đặc biệt có tên trùng với tên lớp, không có kiểu trả về (void cũng không). Nó được gọi tự động khi một đối tượng của lớp được tạo ra, và vai trò chính là khởi tạo trạng thái ban đầu cho đối tượng.
- C. Constructor là một từ khóa trong Java để khai báo biến hằng số.
- D. Constructor là một loại interface trong Java.
Câu 21: Sự khác biệt giữa `break` và `continue` statement trong vòng lặp Java là gì?
- A. `break` statement dùng để thoát hoàn toàn khỏi vòng lặp hiện tại, còn `continue` statement chỉ bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp tiếp theo.
- B. `break` statement dùng để bỏ qua lần lặp đầu tiên của vòng lặp, còn `continue` statement bỏ qua lần lặp cuối cùng.
- C. Không có sự khác biệt, `break` và `continue` có thể thay thế cho nhau trong mọi trường hợp.
- D. `break` dùng trong vòng lặp `for`, `continue` dùng trong vòng lặp `while`.
Câu 22: Trong Java, "access modifiers" (phạm vi truy cập) như `public`, `private`, `protected`, và default (package-private) có ý nghĩa gì và chúng kiểm soát quyền truy cập như thế nào?
- A. Access modifiers chỉ dùng để đặt tên biến và phương thức.
- B. Access modifiers dùng để tối ưu hóa hiệu suất chương trình.
- C. Access modifiers quy định phạm vi truy cập của các thành viên lớp (biến, phương thức, constructor) từ các lớp khác nhau. `public`: mọi nơi, `protected`: cùng package và lớp con, default (package-private): cùng package, `private`: chỉ trong lớp đó.
- D. Access modifiers dùng để khai báo kiểu dữ liệu cho biến.
Câu 23: Giải thích ngắn gọn về khái niệm "đa luồng" (multithreading) trong Java và lợi ích của việc sử dụng đa luồng.
- A. Đa luồng là việc chia nhỏ chương trình thành các module nhỏ hơn để dễ quản lý.
- B. Đa luồng là việc chạy nhiều chương trình Java cùng một lúc.
- C. Đa luồng là việc sử dụng nhiều máy tính để chạy một chương trình Java.
- D. Đa luồng là khả năng thực hiện đồng thời nhiều phần của một chương trình (các luồng) trong cùng một tiến trình. Lợi ích: tăng hiệu suất, tận dụng CPU đa nhân, cải thiện tính phản hồi của ứng dụng.
Câu 24: Cho đoạn code sau, kết quả in ra là gì?
```java
public class Increment {
public static void main(String[] args) {
int x = 5;
int y = x++;
System.out.println(
- A. x = 6, y = 6
- B. x = 6, y = 5
- C. x = 5, y = 5
- D. x = 5, y = 6
Câu 25: Trong Java, "generic" (kiểu tham số hóa) được sử dụng để làm gì và lợi ích của việc sử dụng generic là gì?
- A. Generics được sử dụng để tạo ra các kiểu dữ liệu mới trong Java.
- B. Generics được sử dụng để tăng tốc độ thực thi của chương trình Java.
- C. Generics cho phép tham số hóa kiểu dữ liệu cho lớp, interface, và phương thức. Lợi ích: tăng tính type-safety (kiểm tra kiểu tại thời điểm biên dịch), giảm lỗi ClassCastException runtime, và tăng khả năng tái sử dụng code.
- D. Generics được sử dụng để quản lý bộ nhớ trong Java.
Câu 26: Hãy nêu một vài đặc điểm của ngôn ngữ lập trình Java khiến nó trở nên "platform-independent" (độc lập nền tảng).
- A. Java chỉ chạy được trên hệ điều hành Windows.
- B. Java biên dịch mã nguồn thành bytecode, bytecode này có thể chạy trên bất kỳ hệ điều hành nào có JVM (Java Virtual Machine).
- C. Java sử dụng trình biên dịch riêng cho mỗi hệ điều hành.
- D. Java là ngôn ngữ thông dịch hoàn toàn, không cần biên dịch.
Câu 27: "Lambda expression" trong Java là gì và nó thường được sử dụng trong ngữ cảnh nào?
- A. Lambda expression là một loại vòng lặp mới trong Java.
- B. Lambda expression là một cách khai báo biến trong Java.
- C. Lambda expression là một cách định nghĩa lớp ẩn danh.
- D. Lambda expression (biểu thức lambda) là một cách viết ngắn gọn cho anonymous function (hàm ẩn danh). Thường được sử dụng trong functional programming, với Stream API, và xử lý sự kiện.
Câu 28: Trong Java, "Collection Framework" là gì và nó cung cấp những lợi ích gì cho lập trình viên?
- A. Collection Framework là một tập hợp các interface và class trong Java cung cấp các cấu trúc dữ liệu (collections) như List, Set, Map và các thuật toán để thao tác với chúng. Lợi ích: tái sử dụng code, giảm công sức phát triển, hiệu suất tốt, và chuẩn hóa cách làm việc với collections.
- B. Collection Framework là một công cụ để quản lý bộ nhớ trong Java.
- C. Collection Framework là một phần của Java để xử lý đồ họa.
- D. Collection Framework là một thư viện để xây dựng giao diện người dùng.
Câu 29: Cho đoạn code sau. Điều gì xảy ra khi biên dịch và chạy đoạn code này?
```java
public class TypeCasting {
public static void main(String[] args) {
double d = 9.99;
int i = (int) d;
System.out.println(i);
}
}
```
- A. Lỗi biên dịch vì không thể ép kiểu double sang int.
- B. Chương trình in ra
- C. Chương trình in ra
- D. Chương trình in ra
Câu 30: Trong Java, "inner class" (lớp bên trong) là gì và có những loại inner class nào?
- A. Inner class là một lớp được định nghĩa bên ngoài một lớp khác.
- B. Inner class là một lớp được định nghĩa bên trong một lớp khác. Có các loại: member inner class, anonymous inner class, local inner class, và static nested class.
- C. Inner class là một interface được định nghĩa bên trong một class.
- D. Inner class là một class trừu tượng (abstract class).