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

"ถึงกระนั้นบทเรียนของเขาก็มีประโยชน์"

"ใช่ ฉันหมายความว่า เราหวังว่ามันจะเป็นอย่างนั้น ยิ่งคุณได้ยินมุมมองเกี่ยวกับเรื่องนี้มากเท่าไหร่ คุณก็จะยิ่งเข้าใกล้ความจริงมากขึ้นเท่านั้น เมื่อคุณได้ยินเพียงข้อเดียว คุณทำได้เพียงแค่เชื่อหรือไม่เชื่อ เอาล่ะ เรามา กลับไปทำธุรกิจ”

“ลองดูรูปที่ฉันเคยให้คุณดูก่อนสิ”


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. ตัวแปรที่ประกาศในเมธอดมีอยู่ (มองเห็นได้) ตั้งแต่เริ่มประกาศจนถึงสิ้นสุดเมธอด

2. ตัวแปรที่ประกาศในบล็อคโค้ดมีอยู่จนกระทั่งสิ้นสุดบล็อคโค้ด

3. พารามิเตอร์ของเมธอดมีอยู่จนกว่าเมธอดจะส่งคืน

4. ตัวแปรในวัตถุมีอยู่ตลอดอายุขัยของวัตถุที่มีตัวแปรเหล่านั้น การมองเห็นของพวกเขายังถูกควบคุมโดยตัวดัดแปลงการเข้าถึงพิเศษ

5. ตัวแปรคงที่ (คลาส) มีอยู่ตลอดเวลาที่โปรแกรมกำลังทำงาน การมองเห็นยังถูกกำหนดโดยตัวดัดแปลงการเข้าถึงอีกด้วย"

“ใช่ ฉันจำภาพนี้ได้”

"เยี่ยมมาก ฉันขอเตือนคุณเกี่ยวกับประเด็นสำคัญบางประการ"

"ตัวแปรทั้งหมดที่ประกาศภายในเมธอดมีอยู่ (มองเห็นได้) จากจุดที่มีการประกาศจนจบเมธอด (ตัวอย่างที่ 1)"

"หากมีการประกาศตัวแปรในบล็อคโค้ด ตัวแปรนั้นจะมีอยู่จนถึงจุดสิ้นสุดของบล็อคโค้ด (ตัวอย่างที่ 2)"

"ถ้าตัวแปรเป็นพารามิเตอร์เมธอด ตัวแปรนั้นมีอยู่ (มองเห็นได้) ในเนื้อความทั้งหมดของเมธอด (ตัวอย่างที่ 3)"

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

"หากมีการประกาศตัวแปรแบบสแตติก เช่น ทำเครื่องหมายด้วยคีย์เวิร์ดstaticตัวแปรนั้นจะคงอยู่ตราบเท่าที่คลาสนั้นมีอยู่ JVM มักจะโหลดคลาสลงในหน่วยความจำเมื่อใช้งานครั้งแรก นั่นคือเมื่อตัวแปรสแตติกถูกเตรียมใช้งาน"

เพิ่มเติมเกี่ยวกับขอบเขตตัวแปร - 1

"ตัวอย่างด้านบนประกาศคลาส Cat ซึ่งมีตัวแปรสี่ตัว: a, b, s (ตัวแปรที่ไม่ใช่แบบคงที่) และนับ (ตัวแปรแบบคงที่) ถ้าเราสร้างวัตถุหลายตัวของคลาสนี้ (เช่น สาม) แต่ละอัน พวกมันจะมีอินสแตนซ์ของตัวเองของตัวแปรที่ไม่ใช่สแตติกของคลาส ตัวแปรสแตติกจะถูกใช้ร่วมกันโดยออบเจกต์ทั้งหมดของคลาสพูดทางเทคนิค มันไม่ได้อยู่ในออบเจ็กต์เหล่านี้ด้วยซ้ำ เพราะมันมีอยู่ก่อนที่ออบเจ็กต์ Cat ใดๆ จะถูกสร้างขึ้น"

"นี่คือสิ่งที่จะเกิดขึ้นหากเราประกาศตัวแปรsคงที่:"

เพิ่มเติมเกี่ยวกับขอบเขตตัวแปร - 2

"ตกลง ฉันคิดว่าฉันเข้าใจแล้ว"

"ประกาศตัวแปรชื่อเดียวกันได้ไหม"

"ไม่ได้อยู่ในเมธอดตัวแปรทั้งหมดที่ประกาศในเมธอดต้องมีชื่อเฉพาะอาร์กิวเมนต์ของเมธอดก็ถือเป็นตัวแปรโลคอลด้วย"

"แล้วตัวแปรสมาชิกล่ะ"

"ตัวแปรสมาชิกต้องไม่ซ้ำกันสำหรับแต่ละคลาส"

"แต่มีข้อยกเว้น: ชื่อของตัวแปรโลคัลและตัวแปรสมาชิกสามารถเหมือนกันได้ "

"หากเราเปลี่ยนตัวแปรดังกล่าว ตัวแปรที่มีชื่อเหมือนกันสองตัวแปรใดจะถูกเปลี่ยน"

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

ตัวอย่างที่มีตัวแปรนับสองตัว
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"โค้ดนี้ประกาศตัวแปรนับสองตัว บรรทัดที่ 3 ประกาศตัวแปรอินสแตนซ์และบรรทัดที่ 8 – ตัวแปรโลคัล "

"ต่อไปนี้คือสิ่งที่เกิดขึ้นเมื่อเรียกใช้เมธอด:"

"ในบรรทัดที่ 7 เราเข้าถึงตัวแปรอินสแตนซ์และกำหนดค่า 15 ให้กับตัวแปรนั้น"

"ในบรรทัดที่ 8 เราประกาศ (สร้าง) ตัวแปรโลคัล ใหม่ : countซึ่งจะปกปิดตัวแปรอินสแตนซ์ ตัวแปรโลคัลคือสิ่งที่โค้ดที่ตามมาทั้งหมดในเมธอดจะเห็น (การเข้าถึง)"

"เข้าใจแล้ว."

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

ตัวแปรคงที่ (คลาส)
ClassName.variableName

// Here are some examples:
Cat.catsCount
ตัวแปรแบบไม่คงที่ (อินสแตนซ์)
this.variableName

// Here are some examples:
this.catsCount

"คุณสามารถบอกอะไรได้อีกบ้างเกี่ยวกับวิธีการแบบคงที่และตัวแปรแบบคงที่"

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

"ฉันมีคำถาม."

"ความแตกต่างระหว่างวิธีการแบบคงที่และไม่คงที่คืออะไร"

"มาดูวิธีการทำงานของ non-static:"

รหัสมีลักษณะอย่างไร
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
เกิดอะไรขึ้นจริงๆ
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"เมื่อคุณเรียกเมธอดโดยใช้<object> dot <method name>คุณกำลังเรียกเมธอดคลาสและส่งอ็อบเจกต์เดียวกันกับอาร์กิวเมนต์แรก ภายในเมธอด อ็อบเจ็กต์จะถูกเรียกว่า'this'การดำเนินการทั้งหมดใน วิธีการดำเนินการกับวัตถุนี้และข้อมูลของมัน"

"ว้าว! นั่นคือวิธีการทำงานทั้งหมด!"

"และนี่คือวิธีการทำงานแบบสแตติก"

รหัสมีลักษณะอย่างไร
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
เกิดอะไรขึ้นจริงๆ
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"เมื่อคุณเรียกใช้เมธอดสแตติก จะไม่มีการส่งผ่านออบเจกต์ใดๆ ไปยังเมธอด กล่าวอีกนัยหนึ่ง'สิ่งนี้'เท่ากับnullนั่นเป็นสาเหตุที่เมธอดสแตติกไม่สามารถเข้าถึงตัวแปรและเมธอดที่ไม่ใช่สแตติกได้ (เนื่องจากไม่มี'สิ่งนี้'ให้ส่งผ่าน วิธีการเหล่านี้)"

"อืม ฉันคิดว่าฉันเข้าใจแล้ว อย่างน้อยก็นิดหน่อย"

"และนี่คือลุงดิเอโก...และงานของเขา"