JavaScript is required

Cho class như sau: class KiemTra { private int i; private int nextId; public void setId() { id = nextId; nextId++; } } Nếu khởi tạo 2 đối tượng class A extends KiemTra và class B extends KiemTra, id của đối tượng B có giá trị là ?

A.

A. 0

B.

B. 1

C.

C. Không có giá trị đúng

Trả lời:

Đáp án đúng: C


Đ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 liên quan