เป็นโมฆะObject
ใน Java หรือไม่?
Null
(เป็นลักษณะจริง) null
มีตัวอย่างเดียว
null instanceof Object
เป็นเท็จ แต่ผลตอบแทนtypeof(null)
'object'
เป็นวัตถุในกรณีนั้นหรือไม่? ใครจะรู้.
เป็นโมฆะObject
ใน Java หรือไม่?
Null
(เป็นลักษณะจริง) null
มีตัวอย่างเดียว
null instanceof Object
เป็นเท็จ แต่ผลตอบแทนtypeof(null)
'object'
เป็นวัตถุในกรณีนั้นหรือไม่? ใครจะรู้.
คำตอบ:
หาก null เป็น Object ก็จะสนับสนุนวิธีการjava.lang.Object
เช่นequals()
. อย่างไรก็ตามนี่ไม่ใช่กรณี - การเรียกใช้เมธอดใด ๆ บนผลลัพธ์ null ใน a NullPointerException
.
และนี่คือสิ่งที่ข้อกำหนดภาษา Javaกล่าวไว้ในหัวข้อนี้:
นอกจากนี้ยังมีประเภท null พิเศษประเภทของนิพจน์ null ซึ่งไม่มีชื่อ เนื่องจากประเภท null ไม่มีชื่อจึงไม่สามารถประกาศตัวแปรของประเภท null หรือส่งไปยังประเภท null ได้ การอ้างอิง null เป็นค่าเดียวที่เป็นไปได้ของนิพจน์ประเภท null การอ้างอิง null สามารถส่งไปยังประเภทการอ้างอิงใดก็ได้ ในทางปฏิบัติโปรแกรมเมอร์สามารถละเว้นประเภท null และเพียงแค่แสร้งทำเป็นว่า null เป็นเพียงตัวอักษรพิเศษที่สามารถอ้างอิงได้ทุกประเภท
ฉันคิดว่าสิ่งนี้สามารถต้มให้เป็น "null is special" ได้
java.lang.Object
subclasses ในทางปฏิบัติ - ใช่ คุณไม่สามารถสร้างคลาสที่ไม่ใช่คลาสย่อยของ java.lang.Object ได้ แต่ฉันไม่เคยคิดเกี่ยวกับเรื่องนี้จากมุมมองเชิงปรัชญา
NullPointerException
พูดถึง» null
วัตถุ« ... :) แต่แล้วก็เป็นเรื่องปกติที่จะพูดถึง»พอยน์เตอร์ว่าง« ...
ตามที่ Java สเป็ค , null
เป็นชนิดที่สามารถกำหนดให้กับตัวแปรวัตถุ (เป็นค่าตามที่ระบุไว้ในความคิดเห็น) คุณไม่สามารถสร้างอินสแตนซ์หรือสร้างตัวแปรประเภทนี้ได้ แต่คุณต้องใช้ลิเทอรัลnull
ที่คอมไพเลอร์ให้มา
null
ชื่อเป็น "ตัวอย่าง" ของnull
ชนิดเห็นได้ชัด
null
ไม่ใช่ตัวแปร แต่เป็นลิเทอรัล
null
เป็นประเภทที่สามารถกำหนดได้ ": 1) null
(ในรหัส) เป็นลิเทอรัลว่างไม่ใช่ประเภท null 2) ประเภทไม่สามารถกำหนดให้กับตัวแปรใน Java โดยทั่วไปดูJLS 4.1: " มี [... ] ค่าข้อมูลสองชนิดที่สามารถจัดเก็บในตัวแปร [... ]: ค่าดั้งเดิม (§4.2) และค่าอ้างอิง (§4.3) " เป็นการอ้างอิงว่างที่สามารถกำหนดผ่านลิเทอรัลnull
ได้ ... ต่อ ...
length
คลาสย่อยของjava.awt.geom.Point2D
.
ไม่แน่นอน: null instanceof Object
ส่งกลับเท็จ
ไม่มันไม่ใช่วัตถุ
Null คือการไม่มีวัตถุ
JRL เขียนว่า:
ไม่มันไม่ใช่, ...
บ่อยครั้งขึ้นอยู่กับว่าคุณมองไปที่ใดคุณเชื่อใครมากกว่ากัน
ตาม JLS ที่ใช่ก็คือ โดยเฉพาะอย่างยิ่งถ้าคุณเปลี่ยนข้อความคำถามเป็น: " null
ตัวอักษรเป็นประเภทObject
หรือไม่" นอกเหนือจากJLS 4.1 ที่ Michael Borgwardt อ้างถึงข้างต้น:
ดูJLS 3.10.7 :
ลิเทอรัล null เป็นประเภท null เสมอ
และJLS 4.10 :
ประเภทย่อยของประเภท T คือประเภท U ทุกประเภทโดย T เป็นซูเปอร์ไทป์ของ U และประเภท null
หรือJLS 4.10.2 :
ซูเปอร์ไทป์โดยตรงของประเภท null คือประเภทอ้างอิงทั้งหมดนอกเหนือจากประเภท null เอง
[Emphases โดยฉัน]
ตามคอมไพเลอร์ของ Eclipse 2019-09 ไม่ใช่ :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
ตาม OpenJDKs 12.0.1 javac
คือ :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
ในกรณีที่วงเล็บเหลี่ยมบ่งบอกว่าnull
เป็นประเภทอื่นที่ไม่ใช่ชนิดดั้งเดิม และตามJLS 4.1 :
ภาษาการเขียนโปรแกรม Java มีสองประเภท ได้แก่ ประเภทดั้งเดิม (... ) และประเภทอ้างอิง (... )
ถ้าไม่ใช่อย่างนั้นก็เป็นอย่างอื่น
Claudiu เขียนว่า:
โมฆะเป็นสิ่งที่น่าเกลียด
Au ตรงกันข้ามnull
มีความสวยงาม คุณจะแนะนำอะไรเป็นค่าเริ่มต้นสำหรับตัวแปรประเภทการอ้างอิงแทน การรวมบิตโดยพลการ? ยินดีต้อนรับสู่การละเมิดการเข้าถึงหรือที่แย่กว่านั้นคือนรกตัวชี้!
Joachim Sauer เขียนว่า:
null คือประเภทและค่า
จริงๆแล้วมีสามรายการร่วมกับnull (ดูJLS 3.10.7 ด้วย ):
null
(1) โปรดทราบว่าตามJLS 4.10.2 ที่อ้างถึงข้างต้นประเภท nullใช้การสืบทอดหลายรายการไม่เพียง แต่สำหรับอินเทอร์เฟซเท่านั้น แต่สำหรับคลาสด้วย ซึ่งเราทุกคนรู้ดีว่าโปรแกรมเมอร์แอปพลิเคชันเราไม่สามารถทำได้
(2) ลิเทอรัลว่างอาจถูกจินตนาการว่าเป็นตัวแปรที่กำหนดเป็น:
JVM_global final null_type null = new null_type();
หมายเหตุด้วยJLS 3.9 :
บางครั้งถือว่าลำดับอักขระที่หลากหลายเป็นคำหลักไม่ถูกต้อง:
null
ไม่ใช่คีย์เวิร์ด แต่เป็นลิเทอรัลว่าง ( §3.10.7 )
null instanceof <any type>
ด้วย JLS 4.10.2 ในใจ (“ ประเภท nullคือประเภทย่อยของทุกประเภท”) null instanceof <any type>
ควรจะประเมินtrue
เป็นหรือไม่? ตั้งแต่แรกเห็นใช่ แต่JLS 15.20.2ให้คำตอบเชิงลึก:
[... ] ผลลัพธ์ของตัว
instanceof
ดำเนินการคือtrue
ถ้าค่าของRelationalExpression ไม่ใช่null
[... ] มิฉะนั้นผลที่ได้คือfalse
[Emphases โดยฉัน]
ถามตัวเองว่าอะไรสมเหตุสมผลกว่ากัน (จากมุมมองของโปรแกรมเมอร์แอปพลิเคชัน):
การให้false
และทำให้ระบุว่านิพจน์อ้างอิงไม่ใช่ประเภทที่เปิดเผยต่อเรากล่าวคือแสดงว่ามันไม่ได้อ้างอิงสิ่งที่เป็นประโยชน์สำหรับเรา
หรือให้true
ดังนั้นจึงแจ้งให้เราทราบว่านิพจน์ประเมินเป็นการอ้างอิงพิเศษการอ้างอิงโมฆะการอ้างถึง "วัตถุ" เราไม่รู้ว่ามีอยู่หรือไม่และเป็นประเภทว่างพิเศษที่ไม่มีชื่อไม่เปิดเผย us แต่ผ่านลิเทอรัล nullเป็นประเภทย่อยของประเภทใด ๆ รวมถึงการสืบทอดหลายรายการและจะถูกละเว้นหรือไม่? ลองพิจารณาตัวอย่างที่เป็นประโยชน์เพิ่มเติม:
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.
ซึ่งนำไปสู่:
instanceof
ไม่เป็นวิธีที่เหมาะสมในการพูดบางอย่างเกี่ยวกับnull
Object-ness?เรียกว่าinstanceof
ไม่ใช่sameorsubtypeof
เลย นั่นหมายความว่าเรากำลังเปรียบเทียบประเภทของอินสแตนซ์กับประเภทไม่ใช่สองประเภท ตอนนี้null
หมายถึง:“ ไม่มีอินสแตนซ์” และหากไม่มีอินสแตนซ์ก็ไม่มีประเภทของอินสแตนซ์ false
มันเห็นได้ชัดว่าไม่มีอะไรเปรียบเทียบกับสิ่งที่ควรจะนำไปสู่การ
หรือในตัวอย่างโลกแห่งความเป็นจริงที่ "มากกว่า":
ดังที่ Michael กล่าวสรุป: "null is special" แน่นอน
ไม่มันไม่ใช่ตัวอย่างของคลาสหรือคลาส เป็นการอ้างอิงถึงความว่างเปล่า
แก้ไข : ยังไม่ได้อ่านข้อมูลจำเพาะดังนั้นข้างต้นอาจไม่ถูกต้อง 100%
ตามที่อธิบายไว้ในบทที่4.1 ประเภทของประเภทและค่าของข้อกำหนดภาษา Java null คือประเภทที่มีค่าเดียวการอ้างอิงแบบ null (และแสดงด้วยลิเทอรัลnull
):
นอกจากนี้ยังมีประเภทว่างพิเศษประเภทของนิพจน์
null
ซึ่งไม่มีชื่อ เนื่องจากประเภท null ไม่มีชื่อจึงไม่สามารถประกาศตัวแปรของประเภท null หรือส่งไปยังประเภท null ได้ การอ้างอิง null เป็นค่าเดียวที่เป็นไปได้ของนิพจน์ประเภท null การอ้างอิง null สามารถส่งไปยังประเภทการอ้างอิงใดก็ได้ ในทางปฏิบัติโปรแกรมเมอร์สามารถเพิกเฉยต่อประเภท null และแสร้งทำเป็นว่าnull
เป็นเพียงตัวอักษรพิเศษที่สามารถอ้างอิงได้ทุกประเภท
คุณอาจต้องการอ่านเกี่ยวกับNull Object Pattern (ที่ฉันไม่แนะนำ) แม้ว่า ดูC2 WikiหรือWikipediaสำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบนี้
ไม่แม้ว่าจะเป็นแบบนั้น แต่ก็ไม่มีประโยชน์เนื่องจากไม่มีวิธีการหรือฟิลด์ใด ๆ
ไม่ไม่ใช่อ็อบเจ็กต์เนื่องจากอินสแตนซ์ว่างของอ็อบเจ็กต์จะส่งคืนเท็จเสมอนอกจากนี้ยังมีโมฆะเพียงหนึ่งค่าสำหรับแต่ละคลาส
null instanceof <anytype>
จะกลับfalse
ด้วย
ตามที่Java Spec ,
นอกจากนี้ยังมีลิเทอรัลว่างพิเศษที่สามารถใช้เป็นค่าสำหรับการอ้างอิงประเภทใดก็ได้ null อาจถูกกำหนดให้กับตัวแปรใด ๆ ยกเว้นตัวแปรประเภทดั้งเดิม มีเพียงเล็กน้อยที่คุณสามารถทำได้ด้วยค่า null นอกเหนือจากการทดสอบการมีอยู่ ดังนั้นจึงมักใช้ null ในโปรแกรมเป็นเครื่องหมายเพื่อระบุว่าวัตถุบางอย่างไม่พร้อมใช้งาน
Java จัดการกับวัตถุผ่านการอ้างอิง Null คือรายละเอียด OO-ness ของ Java เนื่องจากมันทำให้คุณต่ำกว่าระดับ OO ไม่ใช่ไม่ใช่วัตถุ แต่เป็น VALUE ของข้อมูลอ้างอิง และไม่มีส่วนเกี่ยวข้องกับกระบวนทัศน์ของวัตถุ แต่เกี่ยวข้องกับการต่อท่อของ Java ที่เปิดใช้งานวัตถุ
เป็นโมฆะอินสแตนซ์ของjava.lang.Object
? เลขที่
เป็นโมฆะวัตถุหรือไม่? ขึ้นอยู่กับคำจำกัดความของ " is "
Object foo = null;
System.out.println(foo.toString());
รายการบรรทัดแรกnull
สามารถกำหนดให้พิมพ์Object
ได้ แต่บรรทัดที่สองจะแสดงให้เห็นว่าไม่ใช่อย่างแน่นอนObject
และในที่สุดก็ได้ผลลัพธ์เป็นไฟล์java.lang.NullPointerException
ไม่ใช่null
ไม่ใช่วัตถุเป็นประเภทการอ้างอิงและค่าของมันไม่ได้อ้างถึงวัตถุใด ๆ ดังนั้นจึงไม่มีการแทนค่าnull
ในหน่วยความจำ
Object
ไม่ใช่วัตถุ (เช่นเดียวกับประเภท ) และถ้ามีคนตอบคำถามตามนั้น ...