"ไปที่หัวข้อใหม่กันเถอะ ตอนนี้ฉันอยากจะพูดถึงตัวแปรสแตติกและเมธอด"
"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 จะถูกส่งผ่านไปยังเมธอดแบบสแตติก นั่นเป็นเหตุผลที่พวกเขาไม่สามารถระบุตัวแปรและวิธีการที่ไม่คงที่ พวกเขาไม่มีการอ้างอิงถึงวัตถุที่เกี่ยวข้องกับตัวแปรและวิธีการเหล่านี้"
“โอเค เอลลี่ ฉันเข้าใจแล้ว”
"นี่คือวิธีการทำงานแบบไม่คงที่:
รหัสมีลักษณะอย่างไร
|
เกิดอะไรขึ้นจริงๆ
|
เมื่อคุณเรียกใช้เมธอดโดยใช้ <object> dot <method name> คุณกำลังเรียกเมธอดคลาสและส่งออบเจกต์เดียวกันกับอาร์กิวเมนต์แรก ภายในเมธอด ออบ เจ็กต์เรียกว่า'สิ่งนี้' การดำเนินการทั้งหมดในเมธอดจะดำเนินการกับวัตถุนี้และข้อมูลของมัน" |
"นี่คือวิธีการทำงานแบบคงที่:
รหัสมีลักษณะอย่างไร
|
เกิดอะไรขึ้นจริงๆ
|
เมื่อคุณเรียกใช้เมธอดแบบสแตติก จะไม่มีการส่งผ่านออบเจกต์ไปยังเมธอด กล่าวอีกนัยหนึ่ง'นี่ ' เท่ากับnull นั่นเป็นสาเหตุที่เมธอดแบบสแตติกไม่สามารถเข้าถึงตัวแปรและเมธอดที่ไม่ใช่สแตติกได้ (เนื่องจากไม่มีสิ่งใดที่จะส่งผ่านไปยังเมธอดที่ไม่ใช่สแตติกโดยปริยาย)" |
"ตัวแปรหรือเมธอดจะคงที่หากมีคีย์เวิร์ดคงที่อยู่ข้างหน้า"
"เหตุใดจึงจำเป็นต้องใช้วิธีการดังกล่าวหากมีข้อจำกัดอย่างมาก"
“อืม วิธีการแบบนั้นก็มีข้อดีนะ”
"อย่างแรกเราไม่ต้องผ่านการอ้างอิงวัตถุเพื่อใช้วิธีการและตัวแปรแบบสแตติก "
"ประการที่สองบางครั้งจำเป็นต้องมีสำเนาของตัวแปรเพียงหนึ่งสำเนา ตัวอย่างเช่น System.out (ตัวแปร static out ของคลาส System)"
"สาม บางครั้งคุณต้องเรียกใช้เมธอดก่อนที่คุณจะสามารถสร้างวัตถุได้"
“เอลลี่ คุณช่วยยกตัวอย่างเรื่องนี้ให้ฉันฟังได้ไหม”
"ทำไมคุณถึงคิดว่า เมธอด main()เป็นสแตติกมันสแตติก ดังนั้นโปรแกรมเมอร์สามารถเรียกมันได้ทันทีหลังจากโหลดคลาสลงในหน่วยความจำก่อนที่ออบเจกต์ใดๆ จะถูกสร้างขึ้น"
GO TO FULL VERSION