null เป็นวัตถุหรือไม่? ฉันสามารถพูดได้เลยว่ามันไม่ใช่ ในแง่ที่ว่า มันจะ ให้
(null instanceof Object)
คุณค่า false
นี่คือสิ่งอื่นที่คุณต้องรู้เกี่ยวกับ null:
- คุณไม่สามารถเรียกเมธอดที่มีค่าเป็นโมฆะได้:
x.m()
มันจะเกิดข้อผิดพลาดเมื่อx
ค่าเป็นโมฆะและm
วิธีการนั้นไม่คงที่ อย่างไรก็ตาม หากm
เป็นวิธีแบบคงที่ ทุกอย่างก็โอเค เนื่องจากมีเพียงคลาสเท่านั้นที่สำคัญx
และค่าจะถูกละเว้น - จะมีค่าว่างเพียงค่าเดียวสำหรับทุกคน และจะไม่มีค่าว่างสำหรับแต่ละคลาส ตัวอย่าง
((String) null == (Hashtable) null)
เช่น - เป็นที่ยอมรับได้อย่างสมบูรณ์ที่จะส่งค่า null เป็นพารามิเตอร์ไปยังวิธีการหากวิธีการอนุญาต (บางวิธีอนุญาตให้ใช้พารามิเตอร์ null แต่วิธีอื่นไม่อนุญาต) ตัวอย่างเช่น คุณอาจจะเขียนได้ดี
System.out.println (null)
แต่มันbutstring.compareTo (null)
ใช้งานไม่ได้ ดังนั้นควรระบุในความคิดเห็น javadoc เกี่ยวกับวิธีการของคุณเสมอว่าพารามิเตอร์ของพวกเขายอมรับค่า null ได้หรือไม่ หากไม่ชัดเจนทั้งหมด - ใน JDK ตั้งแต่เวอร์ชัน 1.1 ถึง 1.1.5 การส่งค่า null เป็นอาร์กิวเมนต์ตามตัวอักษรไปยังตัวสร้างของคลาสภายในที่ไม่ระบุชื่อ (เช่น
new SomeClass(null) { ...}
ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ อย่างไรก็ตาม คุณสามารถส่งนิพจน์ที่มีค่า null หรือส่งผ่านค่าบังคับ null ในรูปแบบnew SomeClass((String) null) { ...}
- มีอย่างน้อยสามกรณีที่แตกต่างกัน ซึ่งมักจะแสดงโดยใช้ค่าว่าง:
- ไม่ได้กำหนดค่าเริ่มต้น (ไม่มีการกำหนดค่าเริ่มต้น) ตัวแปรหรือสล็อตที่ยังไม่ได้กำหนดค่าใดๆ
- ไม่มีอยู่จริง/ไม่เกี่ยวข้องตัวอย่างเช่น โหนดเทอร์มินัลของแผนผังไบนารีสามารถเรียกว่าโหนดสามัญที่มีรายการลูกที่เป็นโมฆะ
- ว่างเปล่า (ความว่างเปล่าของบางสิ่ง) ตัวอย่างเช่น คุณสามารถใช้ null เพื่อแสดงแผนภูมิว่างได้ โปรดทราบว่านี่ค่อนข้างแตกต่างจากกรณีก่อนหน้า (ในทางปฏิบัติมักจะสับสน) ข้อแตกต่างคือว่า null เป็นโหนดต้นไม้ที่ยอมรับได้ หรือ null หมายความว่าค่านั้นไม่จำเป็นต้องถือเป็นโหนดต้นไม้หรือไม่
-
// null означает «не применимо» // Здесь нет пустого дерева. class Node { Object data; Node left, right; void print() { if (left != null) left.print(); System.out.println(data); if (right != null) right.print(); } }
-
// null означает пустое дерево // обратите внимание на статические и нестатические методы class Node { Object data; Node left, right; void static print(Node node) { if (node != null) node.print(); } void print() { print(left); System.out.println(data); print(right); } }
-
// Отдельный класс для Empty // null не используется interface Node { void print(); } class DataNode implements Node{ Object data; Node left, right; void print() { left.print(); System.out.println(data); right.print(); } } class EmptyNode implements Node { void print() { } }
เปรียบเทียบการใช้งานโหนดต้นไม้ไบนารีสามวิธีด้วยวิธีเอาต์พุตคอนโซลตามลำดับ:
GO TO FULL VERSION