1. ตัวแปรคงที่
เมื่อโหลดคลาสลงในหน่วยความจำวัตถุคงที่จะถูกสร้างขึ้นทันที วัตถุนี้เก็บตัวแปรคลาสคงที่ (ฟิลด์คลาสคงที่) วัตถุคงที่มีอยู่แม้ว่าจะไม่มีการสร้างวัตถุธรรมดา (ไม่คงที่) ของคลาสก็ตาม
เมื่อเราประกาศตัวแปรในคลาส เราจะระบุว่าตัวแปรเหล่านั้นจะถูกสร้างขึ้นเพียงครั้งเดียว หรือควรมีอินสแตนซ์ที่แตกต่างกันของตัวแปรเหล่านี้ในแต่ละอ็อบเจกต์ ตามค่าเริ่มต้น สำเนาใหม่ของแต่ละตัวแปรจะถูกสร้างขึ้นสำหรับแต่ละอ็อบเจ็กต์
ตัวแปรสแตติกถูกผูกไว้กับอ็อบเจกต์สแตติกของคลาส และจะมีอินสแตนซ์เดียวของมันเสมอ
ในการสร้างตัวแปรสแตติกในคลาส คุณต้องเขียนคีย์เวิร์ดstatic
ก่อนชื่อ รูปแบบทั่วไปสำหรับการประกาศตัวแปรสแตติกคือ:
static Type name = value;
หากตัวแปรสแตติกไม่ได้รับการกำหนดค่าเริ่มต้น ตัวแปรนั้นจะเริ่มต้นด้วยค่าเริ่มต้น:
พิมพ์ | ค่าเริ่มต้น |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(อันเดียวกับ
) |
|
|
และชั้นเรียนใดๆ |
|
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
|
|
|
|
|
|
|
|
ภายในคลาส คุณสามารถอ้างถึงตัวแปรสแตติกของคลาสได้ง่ายๆ โดยใช้ชื่อของมัน แต่หากต้องการเข้าถึงจากคลาสอื่น คุณต้องเขียนชื่อคลาสก่อนชื่อตัวแปรสแตติก
ClassName.variable
ตัวอย่าง:
ตัวแปร | ระดับ | การเข้าถึงตัวแปรนอกคลาส |
---|---|---|
|
|
|
|
|
|
|
|
ตัวแปรprivate คือ ไม่สามารถมองเห็นได้นอกชั้นเรียน |
|
|
ตัวแปรprivate คือ ไม่สามารถมองเห็นได้นอกชั้นเรียน |
|
|
ตัวแปรprivate คือ ไม่สามารถมองเห็นได้นอกชั้นเรียน |
2. ความแตกต่างระหว่างตัวแปรคงที่และไม่คงที่
ตัวแปรที่ไม่คงที่ (สามัญ) ของคลาสจะถูกประกาศในลักษณะเดียวกับตัวแปรคงที่ แต่ไม่มีstatic
คีย์เวิร์ด
ตัวแปรธรรมดากับตัวแปรคงที่ต่างกันอย่างไร?
ตัวแปรสามัญของคลาสถูกผูกไว้กับอ็อบเจกต์ของคลาส (อินสแตนซ์ของคลาส) ในขณะที่ตัวแปรสแตติกถูกผูกไว้กับอ็อบเจกต์สแตติกของคลาส
หากมีหลายอินสแตนซ์ของคลาส แต่ละอินสแตนซ์จะมีสำเนาของตัวแปรที่ไม่คงที่ (ธรรมดา) ของตัวเอง ตัวแปรสแตติกของคลาสจะถูกจัดเก็บไว้ในวัตถุสแตติกเสมอ และมีเพียงอินสแตนซ์เดียวเท่านั้นที่มีอยู่
คุณสามารถเข้าถึงตัวแปรธรรมดา (ฟิลด์) ของคลาสได้ก็ต่อเมื่อคุณมีการอ้างอิงถึงวัตถุของคลาส และวิธีการภายในของชั้นเรียนแน่นอน
ตัวอย่าง:
การเข้าถึงฟิลด์ของคลาสโดยใช้การอ้างอิงวัตถุ |
---|
|
คุณสามารถเข้าถึงตัวแปรสแตติกได้จากทุกที่ (หลังจากบัญชีสำหรับตัวดัดแปลงการมองเห็น): จากเมธอดธรรมดา จากเมธอดสแตติกของคลาสเดียวกัน จากเมธอดของคลาสอื่น เป็นต้น
ตัวอย่าง:
การเข้าถึงฟิลด์สแตติกของคลาสโดยไม่ต้องใช้การอ้างอิงวัตถุ |
---|
|
วิธีจัดระเบียบหน่วยความจำ:
สมมติว่าเรามีPerson
คลาสที่มี 4 ฟิลด์: 2 ฟิลด์เป็นแบบคงที่และอีก 2 ฟิลด์ที่ไม่คงที่
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
ทันทีที่โหลดคลาส
เมื่อเครื่อง Java โหลดPerson
คลาสเสร็จแล้ว หน่วยความจำจะมีลักษณะดังนี้:
หลังจากสร้างวัตถุชิ้นแรก
หากเราสร้างPerson
วัตถุ รูปภาพจะกลายเป็นดังนี้:
โปรดทราบว่าแม้ว่าวัตถุทั้งสองจะมีตัวแปรสองตัว แต่สิ่งเหล่านี้เป็นตัวแปรที่แตกต่างกัน: วัตถุธรรมดามีตัวแปรธรรมดา และวัตถุคงที่มีตัวแปรคงที่
เราต้องการวัตถุมากขึ้น
มาสร้างPerson
วัตถุ อีกสองชิ้น ตอนนี้หน่วยความจำจะมีลักษณะดังนี้:
โปรดทราบว่าแต่ละวัตถุมีตัวแปรอายุและชื่อของตัวเอง
3. การลบและเพิ่มstatic
ตัวดัดแปลง
จากคงที่เป็นธรรมดา
จะเกิดอะไรขึ้นถ้าเรานำตัวแปรสแตติกมาแปลงเป็นตัวแปรธรรมดาโดยเอาตัวstatic
ดัดแปลง ออก ตัวอย่างเช่นstatic int sum
ตัวแปร
รหัสที่แก้ไขจะมีลักษณะดังนี้:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
ตอนนี้หน่วยความจำมีลักษณะดังนี้:
ตัวแปรคงที่หายไปจากวัตถุคงที่ และตอนนี้แต่ละวัตถุธรรมดามีsum
ตัวแปร ของตัวเอง
จากธรรมดาเป็นคงที่
เราสามารถทำสิ่งที่ตรงกันข้ามได้: เพิ่มstatic
ตัวแก้ไขให้กับตัวแปรธรรมดาของคลาส พวกเขาจะหายไปจากวัตถุธรรมดาทั้งหมดและจะปรากฏในวัตถุคงที่ สมมติว่าเราตัดสินใจที่จะทำให้ ตัวแปร age
และname
คงที่ จากนั้นโค้ดจะมีลักษณะดังนี้:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
และตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

GO TO FULL VERSION