JRL đã viết:
Không, không, ...
Thông thường, nó phụ thuộc vào việc bạn nhìn vào nó từ đâu, bạn tin ai hơn.
Theo JLS, đúng là như vậy . Đặc biệt nếu bạn diễn đạt lại câu hỏi thành: “Có phải null
nghĩa đen của loại Object
không?”. Ngoài JLS 4.1 được trích dẫn bởi Michael Borgwardt ở trên:
Xem JLS 3.10.7 :
Một ký tự null luôn thuộc loại null.
và JLS 4.10 :
Các kiểu con của kiểu T là tất cả các kiểu U sao cho T là siêu kiểu của U và kiểu rỗng.
hoặc JLS 4.10.2 :
Các siêu kiểu trực tiếp của kiểu null là tất cả các kiểu tham chiếu khác với bản thân kiểu null.
[Tôi nhấn mạnh.]
Theo trình biên dịch của Eclipse 2019-09, nó không phải là :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Theo OpenJDKs 12.0.1, javac
nó là :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Trong đó dấu ngoặc nhọn ngụ ý rằng đó null
là một kiểu khác với kiểu nguyên thủy. Và theo JLS 4.1 :
Có hai loại kiểu trong ngôn ngữ lập trình Java: kiểu nguyên thủy (...) và kiểu tham chiếu (...).
nếu nó không phải là một trong những nó là khác.
Claudiu đã viết:
null là loại xấu xí.
Au contraire, null
là đẹp. Thay vào đó, bạn sẽ đề xuất điều gì làm giá trị mặc định cho biến loại tham chiếu? Một sự kết hợp bit tùy ý? Chào mừng bạn đến với vi phạm quyền truy cập hoặc thậm chí tệ hơn, địa ngục con trỏ!
Joachim Sauer đã viết:
null là một kiểu và một giá trị.
Thực tế có ba mục kết hợp với null (xem thêm JLS 3.10.7 ):
- Loại null (không được đặt tên khác) .
- Nghĩa
null
đen .
- Giá trị tham chiếu rỗng . (Thường được viết tắt là giá trị null hoặc đơn giản là null .)
(1) Lưu ý rằng, theo JLS 4.10.2 được trích dẫn ở trên, kiểu null sử dụng đa kế thừa không chỉ cho các giao diện mà còn cho các lớp. Điều mà chúng ta đều biết là không thể đối với các lập trình viên ứng dụng.
(2) Chữ null có thể được hình dung như một biến được định nghĩa là:
JVM_global final null_type null = new null_type();
Cũng lưu ý JLS 3.9 :
Một loạt các chuỗi ký tự đôi khi được giả định, không chính xác, là từ khóa:
null
không phải là một từ khóa, mà là một chữ rỗng ( §3.10.7 ).
Liên quan null instanceof <any type>
Với JLS 4.10.2 trong tâm trí (“ kiểu null là kiểu con của mọi kiểu”) null instanceof <any type>
nên được đánh giá theo true
, phải không? Ngay từ cái nhìn đầu tiên, có, nhưng JLS 15.20.2 đưa ra câu trả lời sâu sắc:
[...] kết quả của instanceof
toán tử là true
nếu giá trị của RelationalExpression không phải lànull
[...]. Nếu không thì kết quả làfalse
.
[Tôi nhấn mạnh.]
Hãy tự hỏi bản thân xem điều gì có ý nghĩa hơn (theo quan điểm của một lập trình viên ứng dụng):
Đưa ra false
và do đó chỉ ra rằng một biểu thức tham chiếu không thuộc loại được hiển thị cho chúng ta, tức là cho biết nó không tham chiếu đến bất kỳ điều gì hữu ích cho chúng ta
hoặc đưa ra true
, do đó thông báo cho chúng tôi rằng biểu thức đánh giá đến một tham chiếu đặc biệt, tham chiếu null , tham chiếu đến một "đối tượng" mà chúng tôi không biết liệu nó có tồn tại hay không và thuộc loại rỗng đặc biệt không có tên, không được hiển thị với chúng tôi nhưng thông qua nghĩa đen , là một kiểu con của bất kỳ kiểu nào bao gồm đa kế thừa và vẫn bị bỏ qua? Cũng hãy xem xét ví dụ thực tế hơn:
class Car implements Vehicle {
...
Vehicle car = null;
...
boolean b = car instanceof Car; // True? There's not even an instance
... // which could be of type Car.
Điều này cũng dẫn đến:
Tại sao instanceof
không phải là một cách thích hợp để nói điều gì đó về null
Object-ness của?
Nó được gọi là instanceof
không sameorsubtypeof
. Điều đó có nghĩa là chúng ta đang so sánh kiểu của một cá thể với một kiểu chứ không phải hai kiểu. Bây giờ null
có nghĩa là: “Không có trường hợp nào” và nếu không có trường hợp thì không có kiểu của trường hợp. Rõ ràng là so sánh không có gì với một cái gì đó được cho là dẫn đến false
.
Hoặc trong một ví dụ "hơn" trong thế giới thực:
- Tôi cầm trên tay một bức ảnh kích thước thật về một quả táo ( = loại tham chiếu ) với chữ »Big Apple« ( = tên loại tham chiếu ) trên đó.
- Có một cái bàn ( = đống ) trước mặt tôi.
- Nếu có một quả táo ( = instance ) trên bàn thì có một sợi dây ( = tham chiếu ) được nối với nó.
- Tôi cầm đầu kia của sợi dây này trong tay ( = biến tham chiếu ).
- Tôi vạch quả táo dọc theo dây và so sánh nó với hình ảnh của tôi ( = instanceof ).
- Nếu quả táo có cùng kích thước hoặc lớn hơn bức tranh thì chữ viết »Big Apple« áp dụng cho nó ( = true ).
- Nếu nó nhỏ hơn, thì không ( = false ).
- Nếu không có quả táo trên bàn (= không có trường hợp nào ) và do đó, không có dây nào tồn tại ( = null ) thì cách viết cũng không áp dụng ( = false ). Vì: Không có quả táo nào là quả táo to? Không, không phải.
Như Michael tổng kết: "null là đặc biệt".