Biểu thức trong câu lệnh switch KHÔNG được có kiểu dữ liệu nào?
A.
char
B.
byte
C.
short
D.
String
Đáp án
Trong C/C++, biểu thức trong câu lệnh `switch` phải là một biểu thức có giá trị là một số nguyên hoặc một ký tự. Điều này có nghĩa là các kiểu dữ liệu `char`, `byte`, và `short` đều hợp lệ vì chúng có thể được chuyển đổi thành số nguyên. Tuy nhiên, kiểu dữ liệu `String` (chuỗi ký tự) không phải là một kiểu dữ liệu số nguyên, và do đó không thể sử dụng trong biểu thức `switch`. Trong Java, từ Java 7 trở đi, String có thể được sử dụng trong switch.
Như vậy, đáp án đúng là D. String vì kiểu dữ liệu này không được phép sử dụng trong biểu thức của câu lệnh switch trong C/C++.
Trong C/C++, biểu thức trong câu lệnh `switch` phải là một biểu thức có giá trị là một số nguyên hoặc một ký tự. Điều này có nghĩa là các kiểu dữ liệu `char`, `byte`, và `short` đều hợp lệ vì chúng có thể được chuyển đổi thành số nguyên. Tuy nhiên, kiểu dữ liệu `String` (chuỗi ký tự) không phải là một kiểu dữ liệu số nguyên, và do đó không thể sử dụng trong biểu thức `switch`. Trong Java, từ Java 7 trở đi, String có thể được sử dụng trong switch.
Như vậy, đáp án đúng là D. String vì kiểu dữ liệu này không được phép sử dụng trong biểu thức của câu lệnh switch trong C/C++.
Trong Java, các lớp bao (wrapper classes) được sử dụng để chuyển đổi các kiểu dữ liệu nguyên thủy (primitive data types) thành các đối tượng. Điều này cho phép sử dụng các kiểu dữ liệu nguyên thủy trong các cấu trúc dữ liệu và thuật toán yêu cầu đối tượng. Các lớp bao phổ biến bao gồm Integer, Boolean, Character, Float, Double, Byte, Short và Long. String không phải là một lớp bao; nó là một lớp đại diện cho chuỗi ký tự. Do đó, đáp án đúng là A.
Thứ tự đúng của các thành phần trong một tập tin nguồn Java là: Khai báo package (nếu có) phải đứng đầu tiên, sau đó là các câu lệnh import, và cuối cùng là khai báo lớp (class).
* **Khai báo package:** Xác định package mà lớp (class) thuộc về. Chỉ có thể có một khai báo package trong mỗi tập tin nguồn và nó phải là câu lệnh đầu tiên (nếu có).
* **Câu lệnh import:** Cho phép sử dụng các lớp và interface từ các package khác mà không cần chỉ định đầy đủ tên package của chúng mỗi khi sử dụng. Có thể có nhiều câu lệnh import.
* **Khai báo lớp:** Định nghĩa lớp (class) chính của tập tin. Mỗi tập tin `.java` thường chứa một lớp public có tên trùng với tên tập tin.
Do đó, đáp án C là đáp án chính xác nhất.
Câu hỏi yêu cầu tìm câu khai báo không hợp lệ trong các lựa chọn.
* **A. `string s;`**: Khai báo một biến `s` kiểu `string`. Đây là một khai báo hợp lệ.
* **B. `abstract double d;`**: Từ khóa `abstract` chỉ được sử dụng cho class hoặc method, không được dùng cho biến. Vì vậy, đây là một khai báo không hợp lệ.
* **C. `abstract final double hyperbolConsine();`**: Một phương thức không thể vừa là `abstract` (chỉ khai báo, không có thân) vừa là `final` (không thể override). Do đó, đây là một khai báo không hợp lệ.
Vì có nhiều hơn một đáp án sai, nên ta chọn đáp án chứa cả B và C, tuy nhiên vì không có đáp án nào như vậy, ta sẽ đi vào chi tiết của từng đáp án, đáp án B là đáp án sai rõ ràng nhất, vì abstract không thể đứng trước biến, trong khi đó, đáp án C sai ở mức độ logic sử dụng.
Đoạn mã trên có lỗi vì phương thức `yyy()` trong class `Bbb` cố gắng sửa đổi trường `xxx` của đối tượng `finalRef` (là một thể hiện của class `Aaa`) vốn được khai báo là `final`. Khi một biến tham chiếu được khai báo là `final`, nó có nghĩa là biến đó luôn trỏ đến cùng một đối tượng sau khi được khởi tạo. Tuy nhiên, trạng thái bên trong của đối tượng mà biến `final` trỏ đến (ví dụ: các trường của đối tượng) vẫn có thể thay đổi được, trừ khi các trường đó cũng được khai báo là `final`.
Trong trường hợp này, `finalRef` là `final`, nghĩa là nó luôn trỏ đến cùng một đối tượng `Aaa`. Tuy nhiên, `xxx` trong class `Aaa` không phải là `final`, do đó chúng ta có thể thay đổi giá trị của `xxx` thông qua `finalRef`.
Tuy nhiên, class `Aaa` được khai báo là `final`, điều này có nghĩa là không class nào có thể kế thừa từ nó. Điều này không gây ra lỗi trong đoạn mã đã cho. Và phương thức `yyy()` trong class `Bbb` cũng được khai báo là `final`, điều này có nghĩa là không class con nào có thể ghi đè nó. Điều này cũng không gây ra lỗi trong đoạn mã đã cho.
Vì vậy, đoạn mã trên không có lỗi và biên dịch đúng, không cần sửa đổi gì cả.