Trắc nghiệm Java - Đề 08 được biên soạn kỹ lưỡng với nhiều câu hỏi phong phú, hấp dẫn và bám sát nội dung chương trình học. Đây là cơ hội tuyệt vời để bạn ôn luyện, kiểm tra và nâng cao kiến thức một cách hiệu quả. Hãy cùng bắt đầu làm bài tập ngay hôm nay để tự tin hơn trên hành trình chinh phục môn học này!
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. Khả năng 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. Cơ chế gói dữ liệu (thuộc tính) và phương thức hoạt động trên dữ liệu đó vào trong một đơn vị duy nhất, đồng thời kiểm soát quyền truy cập từ bên ngoài.
- C. Khả năng một đối tượng thuộc lớp này có thể được xem như đối tượng thuộc lớp khác, miễn là chúng có chung interface.
- D. Quá trình đơn giản hóa các đối tượng phức tạp bằng cách chỉ thể hiện những thông tin và hành vi cần thiết.
Câu 2: Cho đoạn mã Java sau:
```java
public class Vehicle {
protected String modelName;
public Vehicle(String modelName) {
this.modelName = modelName;
}
}
public class Car extends Vehicle {
public Car(String modelName) {
super(modelName);
}
public void displayModel() {
System.out.println(
- A. Model: Sedan; Thể hiện tính kế thừa.
- B. Model: Car; Thể hiện tính đa hình.
- C. Lỗi biên dịch do truy cập thuộc tính protected không đúng cách.
- D. Chương trình không xuất ra gì cả.
Câu 3: Interface trong Java được sử dụng để định nghĩa một giao ước (contract) mà các lớp thực thi (implement) phải tuân theo. Phát biểu nào sau đây SAI về interface?
- A. Interface chỉ chứa các phương thức trừu tượng (abstract methods) và các hằng số (constants).
- B. Một lớp có thể thực thi nhiều interface.
- C. Interface có thể chứa các biến instance (instance variables) để lưu trữ trạng thái.
- D. Interface giúp đạt được tính đa hình (polymorphism) trong Java.
Câu 4: Xem xét đoạn mã sau:
```java
List names = new ArrayList<>();
names.add(
- A. System.out.println(names.toString());
- B. for (String name : names) { System.out.println(name); }
- C. for (int i = 0; i < names.size(); i++) { System.out.println(names.get(i)); }
- D. for (int i = names.size() - 1; i >= 0; i--) { System.out.println(names.get(i)); }
Câu 5: Phương thức `equals()` và `hashCode()` có vai trò quan trọng trong Java, đặc biệt khi làm việc với các cấu trúc dữ liệu như `HashMap` và `HashSet`. Điều gì sẽ xảy ra nếu bạn chỉ override phương thức `equals()` mà không override phương thức `hashCode()` trong một lớp tùy chỉnh?
- A. `HashMap` và `HashSet` sẽ hoạt động bình thường, không có vấn đề gì xảy ra.
- B. Các đối tượng bằng nhau theo `equals()` có thể không có cùng giá trị `hashCode()`, dẫn đến hành vi không đúng khi sử dụng trong `HashMap` hoặc `HashSet`.
- C. Chương trình sẽ báo lỗi biên dịch.
- D. Phương thức `equals()` sẽ không hoạt động đúng.
Câu 6: Trong Java Exception Handling, khối lệnh `finally` được sử dụng để đảm bảo một đoạn mã nào đó luôn được thực thi, bất kể điều gì xảy ra trong khối `try` và `catch`. Trong tình huống nào sau đây, khối `finally` sẽ KHÔNG được thực thi?
- A. Khi không có exception nào xảy ra trong khối `try`.
- B. Khi một exception xảy ra trong khối `try` và được xử lý bởi khối `catch` tương ứng.
- C. Khi một exception xảy ra trong khối `try` nhưng không có khối `catch` phù hợp để xử lý.
- D. Khi phương thức `System.exit(0)` được gọi trong khối `try` hoặc `catch`.
Câu 7: Cho đoạn mã sau:
```java
String str1 =
- A. true
true
true; Vì tất cả các biến đều tham chiếu đến cùng một chuỗi
- B. false
false
true; Vì `==` so sánh giá trị, còn `equals()` so sánh tham chiếu.
- C. false
true
true; Vì `==` so sánh tham chiếu, `str1` và `str3` cùng tham chiếu đến String literal trong String pool, còn `str2` là đối tượng String mới.
- D. true
false
false; Vì `str2` được tạo mới, nên khác với `str1` và `str3`.
Câu 8: Stream API trong Java 8+ cung cấp một cách mạnh mẽ để xử lý dữ liệu theo kiểu functional. Đoạn code sau sử dụng Stream API để lọc các số chẵn từ một danh sách:
```java
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers);
```
Nếu thay thế `filter(n -> n % 2 == 0)` bằng `map(n -> n * 2)`, kết quả đầu ra sẽ thay đổi như thế nào?
- A. Kết quả vẫn là `[2, 4, 6]` vì `map` và `filter` có chức năng tương tự.
- B. Kết quả sẽ là `[2, 4, 6, 8, 10, 12]` vì `map` biến đổi mỗi phần tử thành giá trị gấp đôi.
- C. Chương trình sẽ báo lỗi biên dịch vì `map` không thể sử dụng trong trường hợp này.
- D. Kết quả sẽ là một stream rỗng.
Câu 9: Trong Java, garbage collection (GC) là một tiến trình tự động quản lý bộ nhớ. Phát biểu nào sau đây mô tả chính xác nhất về vai trò của Garbage Collector?
- A. Garbage Collector tự động giải phóng bộ nhớ không còn được tham chiếu bởi bất kỳ đối tượng nào trong chương trình, giúp ngăn ngừa rò rỉ bộ nhớ.
- B. Garbage Collector chịu trách nhiệm biên dịch mã byte code Java thành mã máy thực thi.
- C. Garbage Collector là một công cụ gỡ lỗi (debugger) giúp tìm ra lỗi trong chương trình Java.
- D. Garbage Collector quản lý việc cấp phát bộ nhớ cho các đối tượng mới được tạo ra.
Câu 10: Cho đoạn mã sau:
```java
public class Calculator {
public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Calculator.add(5, 10));
System.out.println(Calculator.add(3.5, 2.5));
}
}
```
Đoạn mã trên thể hiện khái niệm nào trong lập trình hướng đối tượng Java?
- A. Kế thừa (Inheritance)
- B. Đóng gói (Encapsulation)
- C. Trừu tượng hóa (Abstraction)
- D. Đa hình (Polymorphism) - cụ thể là method overloading
Câu 11: Từ khóa `static` trong Java được sử dụng để khai báo 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ể. Điều gì xảy ra khi bạn khai báo một biến instance là `static`?
- A. Biến static trở thành biến cục bộ (local variable) bên trong phương thức static.
- B. Biến static trở thành biến lớp (class variable), được chia sẻ bởi tất cả các đối tượng của lớp đó.
- C. Biến static chỉ có thể được truy cập từ bên trong cùng một package.
- D. Biến static không thể được khởi tạo giá trị.
Câu 12: Cho đoạn mã sau:
```java
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(
- A. Thread.sleep(1000);
- B. thread.run();
- C. thread.join();
- D. synchronized(thread) {};
Câu 13: Annotations trong Java cung cấp metadata về chương trình và có thể được xử lý bởi compiler hoặc runtime environment. Annotation `@Override` được sử dụng với mục đích gì?
- A. Để đánh dấu một phương thức là abstract.
- B. Để chỉ ra rằng một phương thức trong lớp con đang ghi đè một phương thức cùng tên từ lớp cha.
- C. Để ngăn compiler tối ưu hóa một phương thức.
- D. Để tạo ra tài liệu API cho một phương thức.
Câu 14: Generics trong Java cho phép bạn tham số hóa kiểu dữ liệu của lớp, interface hoặc phương thức. Lợi ích chính của việc sử dụng generics là gì?
- A. Tăng cường type safety bằng cách phát hiện lỗi kiểu dữ liệu tại thời điểm biên dịch thay vì runtime, và giảm việc ép kiểu (casting).
- B. Tăng hiệu suất chương trình bằng cách giảm overhead của việc kiểm tra kiểu dữ liệu.
- C. Cho phép tạo ra các lớp và interface hoàn toàn trừu tượng.
- D. Giúp đơn giản hóa cú pháp Java.
Câu 15: Lambda expressions trong Java 8+ là một tính năng quan trọng của lập trình hàm. Biểu thức lambda nào sau đây tương đương với anonymous inner class sau:
```java
Comparator comparator = new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
```
- A. () -> o1.compareTo(o2)
- B. (Integer o1, Integer o2) -> { return o1.compareTo(o2); }
- C. (o1, o2) -> o1.compareTo(o2)
- D. Comparator::compare
Câu 16: Phương thức `parseInt()` của lớp `Integer` được sử dụng để làm gì?
- A. Chuyển đổi một số nguyên kiểu int sang String.
- B. Chuyển đổi một chuỗi (String) biểu diễn số nguyên sang kiểu int.
- C. Kiểm tra xem một chuỗi có phải là biểu diễn của một số nguyên hay không.
- D. Định dạng một số nguyên thành chuỗi theo một định dạng cụ thể.
Câu 17: Kiểu dữ liệu `char` trong Java được sử dụng để biểu diễn ký tự Unicode. Vùng giá trị của kiểu `char` là gì?
- A. 0 đến 127 (tương ứng với bảng mã ASCII).
- B. -128 đến 127 (signed byte).
- C. 0 đến 65535 (signed 16-bit integer).
- D. 0 đến 65535 (unsigned 16-bit integer), biểu diễn các ký tự Unicode.
Câu 18: Toán tử `%` trong Java được gọi là toán tử modulo. Nó thực hiện phép toán gì?
- A. Phép chia lấy thương.
- B. Phép nhân.
- C. Phép chia lấy phần dư.
- D. Phép lũy thừa.
Câu 19: Cho đoạn code sau:
```java
int x = 5;
int y = 10;
boolean result = (x++ > 5) && (++y < 11);
System.out.println(
- A. x = 6, y = 11, result = false; Vì cả hai điều kiện đều sai.
- B. x = 5, y = 10, result = false; Vì điều kiện đầu tiên sai nên short-circuit evaluation xảy ra.
- C. x = 6, y = 10, result = false; Vì điều kiện thứ hai sai.
- D. x = 6, y = 10, result = false; Vì điều kiện đầu tiên `(x++ > 5)` sai (do post-increment, x so sánh với 5 trước khi tăng), nên short-circuit evaluation xảy ra, `++y < 11` không được thực hiện.
Câu 20: Vòng lặp `for-each` (enhanced for loop) trong Java được sử dụng chủ yếu để làm gì?
- A. Duyệt qua các phần tử của một mảng (array) hoặc collection (ví dụ: List, Set).
- B. Thực hiện một khối lệnh lặp đi lặp lại một số lần xác định trước.
- C. Lặp vô hạn cho đến khi một điều kiện nào đó được đáp ứng.
- D. Tạo ra một luồng (thread) mới cho mỗi lần lặp.
Câu 21: Phương thức `substring(int beginIndex, int endIndex)` của lớp `String` trả về một chuỗi con (substring). Vị trí kết thúc (endIndex) được xử lý như thế nào?
- A. `endIndex` là vị trí cuối cùng của ký tự được bao gồm trong chuỗi con.
- B. `endIndex` là vị trí cuối cùng của ký tự trong chuỗi gốc.
- C. `endIndex` là vị trí sau ký tự cuối cùng của chuỗi con (exclusive).
- D. `endIndex` không được sử dụng, chuỗi con được trả về đến hết chuỗi gốc.
Câu 22: Trong Java, phương thức `main()` có signature `public static void main(String[] args)`. Giải thích ý nghĩa của từ khóa `static` trong signature này.
- A. `static` cho phép phương thức `main()` được ghi đè (override) trong các lớp con.
- B. `static` cho phép phương thức `main()` được gọi trực tiếp từ lớp mà không cần tạo đối tượng của lớp đó.
- C. `static` đảm bảo rằng phương thức `main()` chỉ được thực thi một lần duy nhất trong chương trình.
- D. `static` làm cho phương thức `main()` trở thành một phương thức trừu tượng (abstract method).
Câu 23: Cho đoạn code sau:
```java
Integer num1 = 100;
Integer num2 = 100;
Integer num3 = 200;
Integer num4 = 200;
System.out.println(num1 == num2);
System.out.println(num3 == num4);
```
Kết quả in ra của đoạn code trên là gì và giải thích tại sao có sự khác biệt (nếu có) giữa hai dòng output?
- A. true
true; Vì `==` so sánh giá trị của đối tượng Integer.
- B. false
false; Vì `==` luôn so sánh tham chiếu đối với đối tượng.
- C. true
false; Vì Integer cache được sử dụng cho giá trị nhỏ (trong khoảng -128 đến 127), `num1` và `num2` tham chiếu cùng đối tượng trong cache, còn `num3` và `num4` thì không.
- D. false
true; Vì chỉ có các đối tượng Integer được tạo bằng literal mới được cache.
Câu 24: Phương thức `toString()` được định nghĩa trong lớp `Object` và được kế thừa bởi tất cả các lớp trong Java. Mục đích chính của việc override phương thức `toString()` trong một lớp tùy chỉnh là gì?
- A. Để so sánh hai đối tượng có bằng nhau hay không.
- B. Để trả về một chuỗi (String) biểu diễn thông tin về đối tượng một cách dễ đọc và có ý nghĩa.
- C. Để chuyển đổi đối tượng sang một kiểu dữ liệu khác.
- D. Để tạo ra một bản sao của đối tượng.
Câu 25: Khi nào bạn nên sử dụng `ArrayList` thay vì `LinkedList` trong Java Collections Framework?
- A. Khi bạn cần truy cập ngẫu nhiên (random access) đến các phần tử thường xuyên, vì `ArrayList` có hiệu suất truy cập phần tử theo index tốt hơn.
- B. Khi bạn cần thêm hoặc xóa phần tử ở đầu hoặc cuối danh sách thường xuyên.
- C. Khi bạn cần thêm hoặc xóa phần tử ở vị trí bất kỳ trong danh sách thường xuyên, vì `LinkedList` có hiệu suất tốt hơn trong trường hợp này.
- D. Khi bạn muốn đảm bảo các phần tử trong danh sách được sắp xếp theo thứ tự.
Câu 26: Access modifiers trong Java (public, private, protected, default) quy định mức độ truy cập của các thành viên lớp. Access modifier nào có phạm vi truy cập RỘNG NHẤT?
- A. `public`
- B. `protected`
- C. `default` (package-private)
- D. `private`
Câu 27: Phương thức `invokeLater()` của lớp `SwingUtilities` trong Java Swing được sử dụng để làm gì?
- A. Để tạo ra một cửa sổ (window) mới trong ứng dụng Swing.
- B. Để thực thi một đoạn mã trên Event Dispatch Thread (EDT), đảm bảo thread-safety khi cập nhật giao diện người dùng (UI).
- C. Để tạm dừng luồng hiện tại trong một khoảng thời gian xác định.
- D. Để đọc dữ liệu đầu vào từ người dùng trong ứng dụng Swing.
Câu 28: Trong lập trình JDBC, interface `PreparedStatement` có lợi thế gì so với `Statement`?
- A. `PreparedStatement` đơn giản hơn và dễ sử dụng hơn `Statement`.
- B. `PreparedStatement` cho phép thực thi các câu lệnh SQL phức tạp hơn.
- C. `PreparedStatement` giúp ngăn chặn SQL injection và thường có hiệu suất tốt hơn cho các câu lệnh SQL được thực thi nhiều lần với các tham số khác nhau.
- D. `PreparedStatement` có thể được sử dụng với nhiều loại cơ sở dữ liệu khác nhau hơn `Statement`.
Câu 29: Serialization trong Java là quá trình chuyển đổi một đối tượng thành một chuỗi byte để có thể lưu trữ hoặc truyền tải qua mạng. Để một lớp có thể được serialized, nó cần phải implement interface nào?
- A. `Cloneable`
- B. `Comparable`
- C. `Serializable` (Không có "z")
- D. `java.io.Serializable`
Câu 30: Cho đoạn mã sau:
```java
public class Example {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
try {
System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(
- A. Exception caught: Program continues
- B. Exception caught: ArrayIndexOutOfBoundsException
Finally block executed
Program continues
- C. Exception caught: ArrayIndexOutOfBoundsException
Program continues
Finally block executed
- D. Chương trình sẽ kết thúc ngay khi exception xảy ra và không in ra gì thêm.