"ไปที่หัวข้อใหม่กันเถอะ ตอนนี้ฉันอยากจะพูดถึงตัวแปรสแตติกและเมธอด"

"Ellie ฉันได้เรียนรู้เกี่ยวกับตัวแปรสแตติกและเมธอดแล้ว แต่ฉันอยากเรียนรู้รายละเอียดเพิ่มเติม"

"เมื่อเราประกาศตัวแปรในคลาส เรากำหนดว่าตัวแปรเหล่านี้จะถูกสร้างเพียงครั้งเดียว หรือแต่ละอินสแตนซ์ (ออบเจกต์) ของคลาสจะมีสำเนาของตัวเอง โดยค่าเริ่มต้น สำเนาใหม่ของตัวแปรจะถูกสร้างขึ้นสำหรับแต่ละออบเจ็กต์ นี่คือลักษณะ:"

การประกาศคลาส
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
รหัสใน วิธีการ หลัก :
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
เอาต์พุตหน้าจอ
Oscar
Missy

"แม้ว่าจะประกาศในคลาสเดียวกัน (Cat) แต่ตัวแปรcat1.nameและcat2.nameค่าต่างๆ ก็มีค่าต่างกันเพราะอ้างอิงออบเจกต์ต่างกัน"
"นั่นสมเหตุสมผลแล้ว"
"อย่างไรก็ตาม มีเพียงหนึ่งสำเนาของตัวแปรสแตติกที่มีอยู่สำหรับทุกอินสแตนซ์ของคลาส และต้องเข้าถึงได้โดยใช้ชื่อคลาส"

การประกาศคลาส
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
รหัสในวิธีการหลัก:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
เอาต์พุตหน้าจอ:
0
1
Oscar
Missy
2

"ตกลงนั่นก็สมเหตุสมผลเช่นกัน"

"เมธอด Java แบ่งออกเป็นสองประเภทเมธอดอินสแตนซ์ถูกเรียกใช้บนออบเจกต์และมีสิทธิ์เข้าถึงข้อมูลของอ็อบเจ็กต์นั้น เมธอดสแตติกไม่มีสิทธิ์เข้าถึงนั้นเนื่องจากไม่มีการอ้างอิงอ็อบเจ็กต์ อย่างไรก็ตาม พวกเขาสามารถอ้างอิงถึง ตัวแปรสแตติกของคลาสและเมธอดสแตติกอื่นๆ

เมธอดแบบสแตติกไม่สามารถระบุเมธอดแบบไม่สแตติกหรือตัวแปรแบบไม่สแตติกได้!"

“ทำไมล่ะเอลลี่”

"ตัวแปรอินสแตนซ์แต่ละตัวมีอยู่ในวัตถุ สามารถเข้าถึงได้ก็ต่อเมื่อคุณมีการอ้างอิงถึงวัตถุนั้น ไม่มีการอ้างอิงดังกล่าวสำหรับเมธอดแบบสแตติก"

"วิธีอินสแตนซ์มีการอ้างอิงดังกล่าวหรือไม่"

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

แทนที่จะเป็นการอ้างอิงวัตถุ ค่า null จะถูกส่งผ่านไปยังเมธอดแบบสแตติก นั่นเป็นเหตุผลที่พวกเขาไม่สามารถระบุตัวแปรและวิธีการที่ไม่คงที่ พวกเขาไม่มีการอ้างอิงถึงวัตถุที่เกี่ยวข้องกับตัวแปรและวิธีการเหล่านี้"

“โอเค เอลลี่ ฉันเข้าใจแล้ว”

"นี่คือวิธีการทำงานแบบไม่คงที่:

รหัสมีลักษณะอย่างไร
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
เกิดอะไรขึ้นจริงๆ
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
เมื่อคุณเรียกใช้เมธอดโดยใช้ <object> dot <method name> คุณกำลังเรียกเมธอดคลาสและส่งออบเจกต์เดียวกันกับอาร์กิวเมนต์แรก ภายในเมธอด ออบ เจ็กต์เรียกว่า'สิ่งนี้' การดำเนินการทั้งหมดในเมธอดจะดำเนินการกับวัตถุนี้และข้อมูลของมัน"

"นี่คือวิธีการทำงานแบบคงที่:

รหัสมีลักษณะอย่างไร
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
เกิดอะไรขึ้นจริงๆ
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
เมื่อคุณเรียกใช้เมธอดแบบสแตติก จะไม่มีการส่งผ่านออบเจกต์ไปยังเมธอด กล่าวอีกนัยหนึ่ง'นี่ ' เท่ากับnull นั่นเป็นสาเหตุที่เมธอดแบบสแตติกไม่สามารถเข้าถึงตัวแปรและเมธอดที่ไม่ใช่สแตติกได้ (เนื่องจากไม่มีสิ่งใดที่จะส่งผ่านไปยังเมธอดที่ไม่ใช่สแตติกโดยปริยาย)"

"ตัวแปรหรือเมธอดจะคงที่หากมีคีย์เวิร์ดคงที่อยู่ข้างหน้า"

"เหตุใดจึงจำเป็นต้องใช้วิธีการดังกล่าวหากมีข้อจำกัดอย่างมาก"

“อืม วิธีการแบบนั้นก็มีข้อดีนะ”

"อย่างแรกเราไม่ต้องผ่านการอ้างอิงวัตถุเพื่อใช้วิธีการและตัวแปรแบบสแตติก "

"ประการที่สองบางครั้งจำเป็นต้องมีสำเนาของตัวแปรเพียงหนึ่งสำเนา ตัวอย่างเช่น System.out (ตัวแปร static out ของคลาส System)"

"สาม บางครั้งคุณต้องเรียกใช้เมธอดก่อนที่คุณจะสามารถสร้างวัตถุได้"

“เอลลี่ คุณช่วยยกตัวอย่างเรื่องนี้ให้ฉันฟังได้ไหม”

"ทำไมคุณถึงคิดว่า เมธอด main()เป็นสแตติกมันสแตติก ดังนั้นโปรแกรมเมอร์สามารถเรียกมันได้ทันทีหลังจากโหลดคลาสลงในหน่วยความจำก่อนที่ออบเจกต์ใดๆ จะถูกสร้างขึ้น"