Cho chương trình tên message.class: public static void main(String[] args) { if (args.equal(“-g”)) System.out.print(“Goodbye, “); for (int i = 1; i < args.length; i++) System.out.print(“ “ + args[i]); } Nếu chương trình chạy với lệnh java message -g cruel world sẽ in kết quả là gì?
>
Đáp án đúng: A
Câu hỏi liên quan
Đ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.
Trong lập trình hướng đối tượng, khi một lớp con (subclass) kế thừa từ một lớp cha (superclass), nó có thể định nghĩa lại (ghi đè) một phương thức đã tồn tại trong lớp cha. Quá trình này được gọi là "Override". Điều này cho phép lớp con cung cấp một cách triển khai cụ thể hơn hoặc khác biệt cho phương thức đó, phù hợp với nhu cầu của nó, trong khi vẫn giữ nguyên tên và kiểu tham số của phương thức.
- Overload: Định nghĩa nhiều phương thức cùng tên nhưng khác tham số (số lượng, kiểu dữ liệu).
- Override: Định nghĩa lại phương thức của lớp cha ở lớp con, giữ nguyên tên và tham số.
- synchronized: Từ khóa dùng để kiểm soát truy cập đồng thời vào một đoạn mã.
- Serializable: Interface đánh dấu một lớp có thể được chuyển đổi thành một chuỗi byte.
Như vậy, đáp án đúng là B. Override.
* Dòng 14: `public float tich(int x)`
* Phương thức `tich` phải là `static` vì nó được gọi từ phương thức `sum` là một phương thức `static`. Trong Java, một phương thức `static` chỉ có thể gọi trực tiếp các phương thức `static` khác từ cùng một lớp.
* Dòng 16: `for (j = 1; j <= x; j ++)`
* Biến `j` chưa được khai báo trong phương thức `tich`. Cần khai báo biến `j` trước khi sử dụng, ví dụ: `for (int j = 1; j <= x; j++)`.
Do đó, đáp án đúng là C.14, 16

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.