1. ตัวแปรคงที่

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

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

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

ในการสร้างตัวแปรสแตติกในคลาส คุณต้องเขียนคีย์เวิร์ดstaticก่อนชื่อ รูปแบบทั่วไปสำหรับการประกาศตัวแปรสแตติกคือ:

static Type name = value;

หากตัวแปรสแตติกไม่ได้รับการกำหนดค่าเริ่มต้น ตัวแปรนั้นจะเริ่มต้นด้วยค่าเริ่มต้น:

พิมพ์ ค่าเริ่มต้น
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(อันเดียวกับ
0
)
boolean
false
Object
และชั้นเรียนใดๆ
null

ตัวอย่าง:

รหัส บันทึก
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

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

ClassName.variable

ตัวอย่าง:

ตัวแปร ระดับ การเข้าถึงตัวแปรนอกคลาส
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
ตัวแปรprivateคือ ไม่สามารถมองเห็นได้นอกชั้นเรียน
private static int count = 0;
Counter
ตัวแปรprivateคือ ไม่สามารถมองเห็นได้นอกชั้นเรียน
private static boolean flag;
Arithmetic
ตัวแปรprivateคือ ไม่สามารถมองเห็นได้นอกชั้นเรียน


2. ความแตกต่างระหว่างตัวแปรคงที่และไม่คงที่

ตัวแปรที่ไม่คงที่ (สามัญ) ของคลาสจะถูกประกาศในลักษณะเดียวกับตัวแปรคงที่ แต่ไม่มีstaticคีย์เวิร์ด

ตัวแปรธรรมดากับตัวแปรคงที่ต่างกันอย่างไร?

ตัวแปรสามัญของคลาสถูกผูกไว้กับอ็อบเจกต์ของคลาส (อินสแตนซ์ของคลาส) ในขณะที่ตัวแปรสแตติกถูกผูกไว้กับอ็อบเจกต์สแตติกของคลาส

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

คุณสามารถเข้าถึงตัวแปรธรรมดา (ฟิลด์) ของคลาสได้ก็ต่อเมื่อคุณมีการอ้างอิงถึงวัตถุของคลาส และวิธีการภายในของชั้นเรียนแน่นอน

ตัวอย่าง:

การเข้าถึงฟิลด์ของคลาสโดยใช้การอ้างอิงวัตถุ
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

คุณสามารถเข้าถึงตัวแปรสแตติกได้จากทุกที่ (หลังจากบัญชีสำหรับตัวดัดแปลงการมองเห็น): จากเมธอดธรรมดา จากเมธอดสแตติกของคลาสเดียวกัน จากเมธอดของคลาสอื่น เป็นต้น

ตัวอย่าง:

การเข้าถึงฟิลด์สแตติกของคลาสโดยไม่ต้องใช้การอ้างอิงวัตถุ
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

วิธีจัดระเบียบหน่วยความจำ:

สมมติว่าเรามี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วัตถุ รูปภาพจะกลายเป็นดังนี้:

ความแตกต่างระหว่างตัวแปรคงที่และไม่คงที่2

โปรดทราบว่าแม้ว่าวัตถุทั้งสองจะมีตัวแปรสองตัว แต่สิ่งเหล่านี้เป็นตัวแปรที่แตกต่างกัน: วัตถุธรรมดามีตัวแปรธรรมดา และวัตถุคงที่มีตัวแปรคงที่

เราต้องการวัตถุมากขึ้น

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

ความแตกต่างระหว่างตัวแปรคงที่และไม่คงที่3

โปรดทราบว่าแต่ละวัตถุมีตัวแปรอายุและชื่อของตัวเอง



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;
}

และตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

การลบและเพิ่มตัวแก้ไขแบบคงที่