1. ตัวแปรท้องถิ่น

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

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

เพื่อความง่าย ลองพิจารณาตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

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

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

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

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

เราสามารถประกาศชื่อตัวแปรโลคัลตัวที่สองb ได้ เนื่องจากb ตัวแปรตัวแรกไม่สามารถมองเห็นได้ในบล็อคโค้ดที่มีbการประกาศตัวแปรตัว ที่สอง


2. พารามิเตอร์

ดังที่เราได้กล่าวไว้ก่อนหน้านี้ แต่ละเมธอดสามารถมีตัวแปรที่เราเรียกว่าพารามิเตอร์ได้ แล้วการมองเห็นและอายุการใช้งานล่ะ?

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

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

อย่างที่เราพูดไปก่อนหน้านี้argsเป็นเพียงตัวแปรที่มีประเภทเป็นอาร์เรย์ของสตริง และเช่นเดียวกับพารามิเตอร์ทั้งหมด มีอยู่ทุกที่ภายในเนื้อหาของวิธีการ ที่กล่าวว่า เรามักจะเพิกเฉยในตัวอย่างของเรา



3. ตัวแปรในคลาส

คุณจะจำได้จากบทเรียนในระดับ 1 ว่าชั้นเรียนสามารถมีเมธอดและตัวแปรได้ เมธอดบางครั้งเรียกว่าเมธอดอินสแตนซ์ และตัวแปร — ตัวแปรอินสแตนซ์หรือฟิลด์ เหล่านี้เป็นคำพ้องความหมายใน Java

ตัวแปร (หรือฟิลด์) ของคลาสคืออะไร

เป็นตัวแปรที่ไม่ได้ประกาศในเมธอดแต่อยู่ในคลาส

สามารถเข้าถึงได้จากวิธีการใด ๆ (ไม่คงที่) ของชั้นเรียน พูดอย่างคร่าว ๆตัวแปรอินสแตนซ์คือตัวแปรที่ใช้ร่วมกันโดยเมธอดทั้งหมดของคลาส

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

ในตัวอย่างนี้ เรามีสองวิธี— add()และ remove()เมธอดadd()จะเพิ่มตัวแปรsumและcountอินสแตนซ์ และremove()เมธอดจะลดตัวแปรsum และ countทั้งสองวิธีทำงานกับตัวแปรอินสแตนซ์ที่ใช้ร่วมกัน

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


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

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

ในระดับ 11 เราจะวิเคราะห์โครงสร้างของตัวแปรคงที่และวิธีการ และคุณจะเข้าใจสาเหตุของข้อจำกัดเหล่านี้

ในการสร้างตัวแปรแบบสแตติก (ตัวแปรคลาส) คุณต้องเขียนstaticคำสำคัญในการประกาศ

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

ClassName.variableName

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

ในตัวอย่างข้างต้น เราสร้างคลาสแยกต่างหากย้ายStorageและcount ตัวแปรsum เข้าไป และประกาศให้เป็นstatic ตัวแปรสแตติกสาธารณะสามารถเข้าถึงได้จากวิธีใดก็ได้ในโปรแกรม (ไม่ใช่เฉพาะจากวิธี)