1. ค่าคงที่

ภาษาโปรแกรมอื่นๆ จำนวนมากมีค่าคงที่ นั่นคือตัวแปรที่ไม่สามารถเปลี่ยนค่าได้ โดยปกติจะใช้กับสิ่งพื้นฐานบางอย่าง เช่น จำนวนPiหรือจำนวนวันในเดือนต่างๆ ของปี ตามหลักการแล้ว โปรแกรมเมอร์สามารถสร้างตัวแปรใดๆ ให้เป็นค่าคงที่ได้ ถ้าเขาหรือเธอตัดสินใจว่าจำเป็นต้องทำเช่นนั้น

คุณจะประกาศตัวแปรที่ไม่เปลี่ยนรูป (ค่าคงที่) ใน Java ได้อย่างไร มีคำหลักพิเศษสำหรับสิ่งนี้: final. การสร้างตัวแปรที่ไม่เปลี่ยนรูปมีลักษณะเหมือนกับการสร้างตัวแปรธรรมดา ข้อแตกต่างเพียงอย่างเดียวคือก่อนประเภทตัวแปร คุณต้องเขียนคำว่าfinalแบบนี้:

final Type name = value;

หากคุณพยายามกำหนดค่าอื่นให้กับfinalตัวแปร โปรแกรมของคุณก็จะไม่คอมไพล์

ตัวแปรfinalต้องได้รับการเตรียมใช้งาน (ต้องกำหนดค่าให้กับตัวแปร) เมื่อมีการประกาศ มีข้อยกเว้นประการหนึ่งสำหรับกฎนี้: คุณสามารถย้ายการกำหนดค่าเริ่มต้นของตัวแปรคลาสสแตติกไปยังตัวสร้าง แต่คุณจะได้เรียนรู้เกี่ยวกับเรื่องนี้ในระดับ 10

เพื่อลดจำนวนคีย์เวิร์ด นักพัฒนา Java ใช้คำนี้finalมากกว่าการประกาศค่าคงที่ finalสามารถใช้กับเมธอดและแม้แต่คลาส เมธอดที่ประกาศเป็นfinalไม่สามารถแทนที่ได้ และคลาสที่ประกาศเป็นfinalไม่สามารถสืบทอดได้

ตัวfinalดัดแปลงอาจถูกเพิ่มก่อนตัวแปรใดๆ: ตัวแปรโลคัล พารามิเตอร์เมธอด ฟิลด์คลาส และตัวแปรคลาสสแตติก

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

ตัวอย่าง:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
เราสร้างอาร์เรย์

ไม่อนุญาต:ตัวแปรdataถูกประกาศเป็นfinal.

แต่คุณสามารถทำได้
และสิ่งนี้ด้วย

ค่าคงที่ทั่วโลก

หากคุณตัดสินใจที่จะประกาศ ค่าคงที่ส่วนกลางในโปรแกรมของคุณ คุณต้องสร้างตัวแปรคลาสสแตติกและสร้างตัวแปรเหล่านั้นpublicและ finalมีลักษณะพิเศษสำหรับชื่อของตัวแปรดังกล่าว: พวกมันเขียนด้วยตัวพิมพ์ใหญ่ทั้งหมดโดยใช้อักขระขีดล่างเพื่อแยกคำ

ตัวอย่าง:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2. เงาตัวแปร

อย่างที่เราพูดไปก่อนหน้านี้ คุณไม่สามารถสร้างตัวแปรโลคัลหลายตัวที่มีชื่อเดียวกันในเมธอดเดียวกันได้ ในวิธีการต่าง ๆ คุณสามารถทำได้

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

ตัวอย่าง:

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

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


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

ในaddเมธอด เราประกาศตัวแปรโลคัลsumชื่อ จนกว่าจะสิ้นสุดเมธอด มันจะแรเงา (หรือมาสก์ ) sumตัวแปรอินสแตนซ์

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

this.name

ต่อไปนี้คือตัวอย่างที่สามารถแก้ไขความขัดแย้งของชื่อได้สำเร็จ:

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

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

ตัวแปรcount และsum มีอยู่ทุกที่โดยมีหรือไม่มีthisคำสำคัญ ในบรรทัดที่sum ตัวแปรโลคัลแสดงsumตัวแปรอินสแตนซ์sum ตัวแปรอินสแตนซ์สามารถเข้าถึงได้โดยใช้thisคำหลัก เท่านั้น

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

ClassName.name

ตัวอย่าง:

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

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

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



3. ตัวแปรภายในforลูป

และอีกหนึ่งข้อเท็จจริงเล็ก ๆ แต่น่าสนใจ

นอกจากนี้ยังมีตำแหน่งที่มีการประกาศตัวแปรในลักษณะพิเศษ — ภายในลูfor

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

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

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

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

ตัวอย่าง:

รหัส การมองเห็นที่เปลี่ยนแปลงได้
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a