1. การสร้างวัตถุ

เรามาถึงการสร้างวัตถุแล้ว คุณเคยเจอสิ่งนี้มาก่อน แต่ตอนนี้เราจะวิเคราะห์หัวข้อนี้โดยละเอียดยิ่งขึ้น การสร้างวัตถุเป็นเรื่องง่ายมาก

ในการสร้างวัตถุ คุณต้องใช้ตัวดำเนินการใหม่ การสร้างวัตถุมีลักษณะดังนี้:

new Class(arguments)

หลังจากสร้างออบเจกต์แล้ว เรามักจะบันทึกการอ้างอิงไปยังออบเจกต์ทันทีในตัวแปร ซึ่งมักจะแชร์ประเภทเดียวกันกับออบเจ็กต์ที่สร้างขึ้น ซึ่งหมายความว่าเมื่อสร้างวัตถุ คุณจะเห็นโค้ดดังนี้:

Class name = new Class(arguments)

การสร้างตัวแปรใหม่ อยู่ที่ไหนและรหัสทางด้านขวาของเครื่องหมายเท่ากับคือการสร้างวัตถุใหม่ที่มีประเภทเป็น.Class nameClass

ตัวอย่าง:

รหัส บันทึก
Object o = new Object();
สร้างObjectวัตถุ
Cat pet = new Cat();
สร้างCatวัตถุ
Scanner console = new Scanner(System.in)
สร้างScannerวัตถุ

โปรแกรมเมอร์มักจะตั้งชื่อตัวแปรตามคลาส แต่ใช้อักษรตัวพิมพ์เล็ก สำหรับโปรแกรมเมอร์มือใหม่ รหัสดังกล่าวอาจสร้างความสับสนได้:

รหัส
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

ไม่มีอะไรผิดปกติกับโค้ดนี้ — นี่เป็นโค้ดธรรมดาที่สุด ซึ่งตัวแปรจะถูกสร้างขึ้นและเริ่มต้นทันทีโดยอ็อบเจกต์ประเภทเดียวกัน

ทางด้านซ้ายของเครื่องหมายเท่ากับ เรามีการสร้างตัวแปร ทางด้านขวา การสร้างวัตถุ แค่นั้นแหละ.

2. ตัวสร้าง

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

ทุกอย่างก็ง่ายเช่นกัน: แต่ละคลาสมีเมธอดพิเศษ (หรือเมธอด) ที่รับผิดชอบในการจัดการอาร์กิวเมนต์ที่ส่งผ่านเมื่อสร้างออบเจกต์ เมธอดเหล่านี้เรียกว่าตัวสร้าง หรือเมื่อเราพูดถึงเพียงหนึ่งเดียว: ตัวสร้าง

การแยกแยะเมธอดคอนสตรัคเตอร์จากเมธอดปกตินั้นเป็นเรื่องง่าย วิธีนี้มีคุณสมบัติเด่นสองประการ:

  • ชื่อของคอนสตรัคเตอร์จะเหมือนกับชื่อของคลาส (และขึ้นต้นด้วยอักษรตัวใหญ่)
  • ตัวสร้างไม่มีประเภทการส่งคืน

โดยทั่วไปแล้วจะมีลักษณะดังนี้:

modifiers Class(arguments)
{
   Code
}

ตัวอย่าง:

รหัส บันทึก
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point




Pointตัวสร้างคลาสคลาส
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




สร้างวัตถุของPointชั้นเรียน ตัวสร้างคลาสจะถูกเรียก

สังเกตว่าตัวสร้างมีลักษณะอย่างไร: ไม่มีประเภทส่งคืนและชื่อเหมือนกับชื่อคลาส

และอีกสิ่งหนึ่ง: ดูโค้ดภายในตัวสร้าง พารามิเตอร์ของตัวสร้างมีชื่อเดียวกันกับฟิลด์ของคลาส: x และ y เป็นแนวปฏิบัติมาตรฐานเพื่อหลีกเลี่ยงการตั้งชื่อพารามิเตอร์ใหม่ ชื่อจะเหมือนกับชื่อฟิลด์ของคลาส ความขัดแย้งของชื่อได้รับการแก้ไขโดยใช้คำหลักนี้

3. การเรียกตัวสร้าง

เมื่อใช้ ตัวดำเนินการ ใหม่และคำสั่งเช่น "new Class ( arguments )" เพื่อสร้างวัตถุใหม่ มีสองสิ่งเกิดขึ้น:

  • เครื่อง Java สร้างวัตถุที่มีประเภทเป็นคลาส
  • เครื่อง Java เรียกตัวสร้างของวัตถุและส่งผ่านอาร์กิวเมนต์ ของคุณ

ในฐานะโปรแกรมเมอร์ คุณจะต้องตัดสินใจว่าตัวสร้างคลาสของคุณควรมีตัวสร้างอะไรบ้าง และตัวสร้างเหล่านี้ควรมีพารามิเตอร์อะไรบ้าง

สมมติว่าคุณตัดสินใจสร้างชั้นเรียนเพื่อติดตามแมวที่ศูนย์พักพิงสัตว์ จากนั้นCatชั้นเรียนของคุณอาจมีลักษณะดังนี้:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
สิ่งนี้ได้รับอนุญาต
Cat cat = new Cat("Whiskers");
แต่ไม่อนุญาต รหัสนี้จะไม่รวบรวม
Cat cat = new Cat();
และสิ่งนี้ไม่ได้รับอนุญาต รหัสนี้จะไม่รวบรวม

คลาสCatมีคอนสตรัคเตอร์เพียงตัวเดียวที่มีพารามิเตอร์ชื่อและอายุ เนื่องจากไม่มีตัวสร้างอื่น คุณต้องส่งชื่อแมว ( name) และอายุ ( age) เป็นอาร์กิวเมนต์เมื่อสร้างวัตถุ การส่งอาร์กิวเมนต์ไปยังตัวสร้างไม่ใช่ตัวเลือก

4. ตัวสร้างหลายตัว

แต่ถ้าคุณต้องการ คุณสามารถเพิ่มตัวสร้างหลายตัวในคลาสได้ ไม่มีการจำกัดจำนวนของตัวสร้างหรือพารามิเตอร์ เมื่อคุณสร้างวัตถุ คอมไพลเลอร์จะเลือกตัวสร้างที่ตรงกับพารามิเตอร์โดยอัตโนมัติ

รหัส บันทึก
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
สิ่งนี้ได้รับอนุญาต: คอนสตรัคเตอร์แรกจะถูกเรียก
Cat cat = new Cat("Whiskers");
สิ่งนี้ได้รับอนุญาต: ตัวสร้างที่สองจะถูกเรียก
Cat cat = new Cat();
แต่ไม่อนุญาต รหัสนี้จะไม่รวบรวม

เราตัดสินใจที่จะคำนึงถึงข้อเท็จจริงที่ว่าอายุของแมวนั้นไม่อาจทราบได้ ในการจัดการกับกรณีนี้ เราได้เพิ่มค่าคงที่พิเศษUNKNOWNพร้อมกับตัวสร้างที่มีพารามิเตอร์เพียงตัวเดียว นั่นคือชื่อของแมว

โปรดทราบว่าเรายังคงเริ่มต้นตัวแปรทั้งสองภายในตัวสร้างทั้งสอง เราแทนที่พารามิเตอร์ที่ไม่รู้จัก/ขาดหายไปด้วยค่าคงUNKNOWNที่

หากไม่มีการกำหนดค่าให้กับตัวแปรอายุ ค่านั้นจะมีค่าเริ่มต้นเป็น 0 อย่างไรก็ตาม ลูกแมวที่พบข้างถนนอาจมีอายุ 0 ปีเต็ม นั่นหมายความว่าเลขศูนย์ในตัวแปรอายุไม่ได้หมายความว่า "ไม่ทราบอายุ"

5. ตัวสร้างเริ่มต้น

หากคุณต้องการให้สร้างอินสแตนซ์ของออบเจกต์โดยไม่มีพารามิเตอร์ใดๆ คลาสของคุณต้องประกาศตัวสร้างที่ไม่มีข้อโต้แย้ง

ตัวสร้างที่ไม่มีพารามิเตอร์ไม่จำเป็นต้องเป็นตัวสร้างที่ไม่มีรหัส ตัวสร้างดังกล่าวสามารถมีรหัสที่เริ่มต้นตัวแปรด้วยค่าเริ่มต้น:

รหัส บันทึก
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
สิ่งนี้ได้รับอนุญาต: คอนสตรัคเตอร์แรกจะถูกเรียก
Cat cat = new Cat();
สิ่งนี้ได้รับอนุญาต: ตัวสร้างที่สองจะถูกเรียก

ตัวสร้างเริ่มต้น

มีจุดสำคัญมากที่คุณควรรู้และจดจำ

ถ้าคลาสของคุณไม่ได้ประกาศตัวสร้างหนึ่งตัว คอมไพเลอร์จะเพิ่มตัวสร้างเริ่มต้น ซึ่งเป็นตัวสร้างที่ไม่มีข้อโต้แย้งพร้อมกับตัวแก้ไขสาธารณะ

แต่ถ้าคลาสของคุณประกาศตัวสร้างแม้แต่ตัวเดียวก็จะไม่มีตัวสร้างเริ่มต้นเพิ่มเข้ามาและคุณจะต้องเพิ่มมันเองหากต้องการ

รหัส บันทึก
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
สิ่งนี้ได้รับอนุญาต: คอนสตรัคเตอร์เริ่มต้นจะถูกเรียก