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