John Squirrels
ระดับ
San Francisco

ขอบเขต Java

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

Java Scope โดยทั่วไป

เหตุใดจึงต้องแยกขอบเขตของตัวแปรและเมธอด ความจริงก็คือบางครั้งโปรแกรมมีขนาดใหญ่มากและอาจเป็นเรื่องยากที่จะติดตามตัวแปรตัวใดตัวหนึ่ง นอกจากนี้ ในโครงการขนาดใหญ่ การตั้งชื่อตัวแปรที่ชัดเจนเป็นสิ่งที่พึงปรารถนา เพื่อให้ชัดเจนว่ามีไว้เพื่ออะไร ขอบเขตช่วยให้คุณมีตัวแปรต่างๆ ที่มีชื่อเดียวกันในส่วนต่างๆ ของโปรแกรมโดยเฉพาะ โค้ดดังกล่าวดูแลรักษาและอ่านได้ง่ายกว่า ขอบเขต Java กำหนดตำแหน่งที่ตัวแปรหรือเมธอดบางอย่างสามารถเข้าถึงได้ในโปรแกรม สั้น ๆ :
  • ตัวแปรที่ประกาศในเมธอดสามารถมองเห็นได้จากจุดเริ่มต้นของการประกาศจนถึงจุดสิ้นสุดของเมธอด (ขอบเขตเมธอด)
  • ตัวแปรที่ประกาศในบล็อกโค้ดมีอยู่จนกระทั่งสิ้นสุดบล็อกโค้ดนั้น
  • ตัวแปรที่เป็นอาร์กิวเมนต์ของเมธอดมีอยู่จนถึงจุดสิ้นสุดของเมธอด
  • ตัวแปรคลาส/อ็อบเจ็กต์มีอยู่ตลอดอายุการใช้งานของอ็อบเจ็กต์ที่มี การมองเห็นถูกควบคุมโดยตัวดัดแปลงการเข้าถึงพิเศษ
  • ตัวแปรคลาสคงที่มีอยู่ตลอดเวลาที่โปรแกรมทำงาน การมองเห็นจะถูกกำหนดโดยตัวดัดแปลงการเข้าถึง

ขอบเขตระดับวิธีการ

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

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
ที่นี่เรามีsecondArgซึ่งเป็นตัวแปรท้องถิ่นหรืออาร์กิวเมนต์เมธอด เราไม่สามารถใช้ตัวแปรนี้นอก เมธอด myMethodหรือก่อนที่จะมีการประกาศ หากตัวแปรเป็นอาร์กิวเมนต์ของฟังก์ชัน ก็จะมองเห็นได้ในส่วนเนื้อหาทั้งหมดของเมธอดนี้ ในตัวอย่างด้านบน เรามีอาร์กิวเมนต์สองข้อ: หาเรื่องใน myMethod และหาเรื่องในเมธอดหลัก

ขอบเขตระดับชั้นเรียน

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

ตัวอย่างโค้ด


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
นามสกุล , ชื่อ , ชื่อที่สองและวันเกิดเป็นตัวแปรอินสแตนซ์

ขอบเขตการบล็อก

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

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
ทั้งตัวแปรผลรวมแรกและตัวแปร i ถูกประกาศภายในลูปและไม่มีอยู่นอกลูปนี้ อย่างไรก็ตาม ผลรวมที่สองถูกประกาศนอกลูป ดังนั้นตัวแปรเฉพาะนี้จะถูกพิมพ์ออกมา

ตัวแปรคงที่

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

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
คุณไม่ควรสร้างตัวอย่างใหม่ของ คลาส Studentเพื่อใช้ตัวแปรวันนี้ แบบคงที่ ที่นี่ "2022" จะพิมพ์

ตัวแก้ไขการเข้าถึง

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

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

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

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

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION