JavaRush /จาวาบล็อก /Random-TH /null เป็นวัตถุใน Java หรือไม่?

null เป็นวัตถุใน Java หรือไม่?

เผยแพร่ในกลุ่ม
null เป็นวัตถุหรือไม่? ฉันสามารถพูดได้เลยว่ามันไม่ใช่ ในแง่ที่ว่า มันจะ ให้(null instanceof Object)คุณค่า falseนี่คือสิ่งอื่นที่คุณต้องรู้เกี่ยวกับ null:
null เป็นวัตถุใน Java หรือไม่?  - 1
  1. คุณไม่สามารถเรียกเมธอดที่มีค่าเป็นโมฆะได้: x.m()มันจะเกิดข้อผิดพลาดเมื่อxค่าเป็นโมฆะและmวิธีการนั้นไม่คงที่ อย่างไรก็ตาม หากmเป็นวิธีแบบคงที่ ทุกอย่างก็โอเค เนื่องจากมีเพียงคลาสเท่านั้นที่สำคัญxและค่าจะถูกละเว้น

  2. จะมีค่าว่างเพียงค่าเดียวสำหรับทุกคน และจะไม่มีค่าว่างสำหรับแต่ละคลาส ตัวอย่าง((String) null == (Hashtable) null)เช่น

  3. เป็นที่ยอมรับได้อย่างสมบูรณ์ที่จะส่งค่า null เป็นพารามิเตอร์ไปยังวิธีการหากวิธีการอนุญาต (บางวิธีอนุญาตให้ใช้พารามิเตอร์ null แต่วิธีอื่นไม่อนุญาต) ตัวอย่างเช่น คุณอาจจะเขียนได้ดีSystem.out.println (null)แต่มันbutstring.compareTo (null)ใช้งานไม่ได้ ดังนั้นควรระบุในความคิดเห็น javadoc เกี่ยวกับวิธีการของคุณเสมอว่าพารามิเตอร์ของพวกเขายอมรับค่า null ได้หรือไม่ หากไม่ชัดเจนทั้งหมด

  4. ใน JDK ตั้งแต่เวอร์ชัน 1.1 ถึง 1.1.5 การส่งค่า null เป็นอาร์กิวเมนต์ตามตัวอักษรไปยังตัวสร้างของคลาสภายในที่ไม่ระบุชื่อ (เช่นnew SomeClass(null) { ...}ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ อย่างไรก็ตาม คุณสามารถส่งนิพจน์ที่มีค่า null หรือส่งผ่านค่าบังคับ null ในรูปแบบnew SomeClass((String) null) { ...}

  5. มีอย่างน้อยสามกรณีที่แตกต่างกัน ซึ่งมักจะแสดงโดยใช้ค่าว่าง:

    • ไม่ได้กำหนดค่าเริ่มต้น (ไม่มีการกำหนดค่าเริ่มต้น) ตัวแปรหรือสล็อตที่ยังไม่ได้กำหนดค่าใดๆ

    • ไม่มีอยู่จริง/ไม่เกี่ยวข้องตัวอย่างเช่น โหนดเทอร์มินัลของแผนผังไบนารีสามารถเรียกว่าโหนดสามัญที่มีรายการลูกที่เป็นโมฆะ

    • ว่างเปล่า (ความว่างเปล่าของบางสิ่ง) ตัวอย่างเช่น คุณสามารถใช้ null เพื่อแสดงแผนภูมิว่างได้ โปรดทราบว่านี่ค่อนข้างแตกต่างจากกรณีก่อนหน้า (ในทางปฏิบัติมักจะสับสน) ข้อแตกต่างคือว่า null เป็นโหนดต้นไม้ที่ยอมรับได้ หรือ null หมายความว่าค่านั้นไม่จำเป็นต้องถือเป็นโหนดต้นไม้หรือไม่

    เปรียบเทียบการใช้งานโหนดต้นไม้ไบนารีสามวิธีด้วยวิธีเอาต์พุตคอนโซลตามลำดับ:


  6. // null означает «не применимо»
    // Здесь нет пустого дерева.
    class Node {
      Object data;
      Node left, right;
    
      void print() {
        if (left != null)
          left.print();
        System.out.println(data);
        if (right != null)
          right.print();
      }
    }

  7. // 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);
      }
    }

  8. // Отдельный класс для 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() { }
    }
ผู้เขียนคำตอบ: Peter Norvig นักวิทยาศาสตร์ชาวอเมริกันในสาขาปัญญาประดิษฐ์ ผู้อำนวยการฝ่ายวิจัยของ Google
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION