Cho khối lệnh sau: for (int i = 1; i < 10; i++) { if (i == 3) continue; System.out.print(i);} Khi chạy chương trình sẽ in ra kết quả là bao nhiêu?
>
Đáp án đúng: D
Câu hỏi liên quan
- `args[0]` sẽ là "-g".
- `args[1]` sẽ là "cruel".
- `args[2]` sẽ là "world".
Vì vậy, `args` không phải là một chuỗi đơn "-g cruel world" mà là một mảng các chuỗi riêng biệt. Đoạn code `if (args.equals("-g"))` so sánh tham chiếu của mảng `args` với chuỗi "-g", sẽ luôn trả về `false`, vì `args` là một mảng, không phải là một chuỗi. Tuy nhiên, câu hỏi chỉ hỏi giá trị của `args`, nên ta cần xác định các phần tử trong mảng.
Như vậy, đáp án chính xác nhất không có trong các lựa chọn đã cho. Đáp án đúng phải là một mảng các chuỗi: `["-g", "cruel", "world"]`
Phân tích code:
- Chương trình `message.class` nhận các tham số dòng lệnh thông qua mảng `args`.
- Câu lệnh `args.equal("-g")` là sai. Trong Java, để so sánh chuỗi, ta phải sử dụng phương thức `equals()` chứ không phải `equal()`. Vì vậy, chương trình sẽ báo lỗi.
Như vậy, đáp án đúng là chương trình sẽ báo lỗi.
Đoạn code cung cấp có một lỗi biên dịch: biến id không được khai báo trong class KiemTra. Giả sử đoạn code được sửa lại như sau:
class KiemTra {
private int i;
private static int nextId = 0; // static để chia sẻ giữa các đối tượng
private int id;
public void setId() {
id = nextId;
nextId++;
}
public int getId() {
return id;
}
}
class A extends KiemTra {}
class B extends KiemTra {}
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.setId();
b.setId();
System.out.println("ID of A: " + a.getId());
System.out.println("ID of B: " + b.getId());
}}
Trong trường hợp này, vì nextId là một biến static, nó sẽ được chia sẻ giữa tất cả các đối tượng của class KiemTra và các class con của nó. Khi đối tượng a thuộc class A được tạo và gọi phương thức setId(), nextId sẽ tăng lên 1. Sau đó, khi đối tượng b thuộc class B được tạo và gọi phương thức setId(), nó sẽ gán giá trị hiện tại của nextId (đã là 1) cho id của b, và sau đó tăng nextId lên 2.
Tuy nhiên, cần lưu ý rằng trong đề bài gốc, biến nextId không được khai báo là static. Nếu nextId không phải là static, mỗi đối tượng sẽ có một bản sao riêng của nextId, và khi đó đối tượng B sẽ có id là 0.
Trong đề bài gốc, biến `id` cũng không được khai báo, nên không thể gán giá trị cho nó. Vì vậy, chương trình sẽ báo lỗi. Tuy nhiên, nếu ta sửa lỗi biên dịch và coi `nextId` là non-static, đáp án sẽ là 0.
Câu hỏi này kiểm tra kiến thức của bạn về các quy tắc và đặc điểm của các từ khóa `final`, `volatile`, `native`, `transient` và `static` trong Java.
Đánh giá các phương án:
* A. Trường final không thể sử dụng với volatile: Đây là một quy tắc đúng. `final` có nghĩa là một biến chỉ có thể được gán một lần, trong khi `volatile` đảm bảo rằng tất cả các luồng nhìn thấy giá trị mới nhất của một biến. Việc sử dụng cả hai cùng nhau không có ý nghĩa thực tế và có thể gây nhầm lẫn.
* B. Phương thức native trong Java có thể có nội dung: Đây là một quy tắc SAI. Phương thức `native` trong Java không có phần thân (body) trong chính file Java. Phần thân của nó được triển khai trong một ngôn ngữ khác (ví dụ: C, C++) và được liên kết thông qua JNI (Java Native Interface).
* C. Khai báo nên khai báo trường transient với final và static: Đây là một quy tắc đúng. Các trường `transient` được sử dụng để đánh dấu các trường không nên được tuần tự hóa (serialized). Các trường `static` thuộc về lớp chứ không phải đối tượng, và các trường `final` là các hằng số. Không có lý do gì để tuần tự hóa các trường này, vì vậy việc đánh dấu chúng là `transient` là hợp lý.
* D. Không có đáp án đúng: Vì phương án B sai, nên phương án này không đúng.
Kết luận:
Phương án B là phương án SAI.
* Overload (Nạp chồng): Cho phép định nghĩa nhiều phương thức trong cùng một lớp có cùng tên nhưng danh sách tham số khác nhau. Khi gọi phương thức, trình biên dịch sẽ chọn phương thức phù hợp nhất dựa trên kiểu và số lượng tham số truyền vào.
* Override (Ghi đè): Xảy ra khi một lớp con định nghĩa lại một phương thức đã có trong lớp cha. Phương thức ghi đè phải có cùng tên, kiểu trả về và danh sách tham số với phương thức ở lớp cha.
* synchronized: Là một từ khóa trong Java được sử dụng để kiểm soát truy cập đồng thời vào các khối mã hoặc phương thức.
* Serializable: Là một interface đánh dấu trong Java, chỉ ra rằng một đối tượng của lớp đó có thể được chuyển đổi thành một luồng byte (serialize) và ngược lại (deserialize).
Như vậy, đáp án đúng là A.

Bộ Đồ Án Tốt Nghiệp Ngành Trí Tuệ Nhân Tạo Và Học Máy

Bộ 120+ Đồ Án Tốt Nghiệp Ngành Hệ Thống Thông Tin

Bộ Đồ Án Tốt Nghiệp Ngành Mạng Máy Tính Và Truyền Thông

Bộ Luận Văn Tốt Nghiệp Ngành Kiểm Toán

Bộ 370+ Luận Văn Tốt Nghiệp Ngành Kế Toán Doanh Nghiệp

Bộ Luận Văn Tốt Nghiệp Ngành Quản Trị Thương Hiệu
ĐĂNG KÝ GÓI THI VIP
- Truy cập hơn 100K đề thi thử và chính thức các năm
- 2M câu hỏi theo các mức độ: Nhận biết – Thông hiểu – Vận dụng
- Học nhanh với 10K Flashcard Tiếng Anh theo bộ sách và chủ đề
- Đầy đủ: Mầm non – Phổ thông (K12) – Đại học – Người đi làm
- Tải toàn bộ tài liệu trên TaiLieu.VN
- Loại bỏ quảng cáo để tăng khả năng tập trung ôn luyện
- Tặng 15 ngày khi đăng ký gói 3 tháng, 30 ngày với gói 6 tháng và 60 ngày với gói 12 tháng.