دوره‌ها / JAVA / حوزه متغیرها (Java Scope)

حوزه متغیرها (Java Scope)

15 دقیقه Article

حوزه متغیرها (Scope): متغیرها کجا زنده هستند؟ 🌐🔍

در جاوا، متغیرها فقط در داخل منطقه‌ای که تعریف شده‌اند قابل دسترسی هستند. به این محدوده Scope گفته می‌شود.

۱. حوزه متد (Method Scope)

متغیرهایی که مستقیماً داخل یک متد تعریف می‌شوند، فقط از زمان تعریف تا انتهای همان متد قابل استفاده هستند:

{code_block('static void myMethod() {\n int x = 100; // این متغیر فقط اینجا شناخته می‌شود\n System.out.println(x);\n}')}

۲. حوزه بلوک (Block Scope)

یک بلوک کد شامل کدهایی است که بین دو آکولاد {} قرار دارند. اگر متغیری را داخل یک بلوک (مثل if یا for) تعریف کنید، خارج از آن آکولادها وجود نخواهد داشت:

{code_block('if (true) {\n int y = 20;\n System.out.println(y); // درست\n}\n// System.out.println(y); // خطا! y اینجا دیگر غریبه است')}

۳. حوزه کلاس (Class Scope / Fields) 🏛️

اگر متغیر را خارج از متدها اما داخل کلاس تعریف کنید، تمام متدهای آن کلاس می‌توانند به آن دسترسی داشته باشند (به این متغیرها Fields یا Attributes می‌گوییم).

Shadowing: اگر یک متغیر در حوزه متد هم‌نام با متغیری در حوزه کلاس باشد، متغیرِ محلی "سایه" روی متغیر کلاس می‌اندازد و اولویت با متغیرِ محلی است.

چرا اسکوپ مهم است؟

مدیریت درست اسکوپ باعث جلوگیری از تداخل نام‌ها و همچنین بهینه‌سازی مصرف حافظه می‌شود، چون متغیرهای محلی بلافاصله پس از اتمام بلاک از حافظه پاک می‌شوند.

نکته طلایی: طبق اصل "کمترین دسترسی"، همیشه متغیرها را در کوچکترین اسکوپ ممکن تعریف کنید.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسی متدها و مدیریت حافظه 🛠️💎

در این بخش، به مفاهیمی می‌پردازیم که برای درک عمیق مدیریت حافظه و کارایی در جاوا حیاتی هستند.

۱. پشته متد (Method Stack) و فریم‌ها

هر بار که متدی فراخوانی می‌شود، جاوا یک Stack Frame جدید در حافظه Stack ایجاد می‌کند. این فریم شامل متغیرهای محلی و پارامترهای متد است. وقتی متد تمام می‌شود، فریم آن از پشته حذف (Pop) می‌شود. درک این فرآیند برای دیباگ کردن خطاهایی مثل StackOverflowError بسیار مهم است.

۲. انتقال پارامتر: Pass-by-Value

یک نکته بسیار مهم در جاوا این است که جاوا همیشه مقادیر را به صورت Pass-by-Value منتقل می‌کند. برای انواع اولیه، خودِ مقدار کپی می‌شود. برای اشیاء (Objects)، "کپیِ ریفرنس" به متد فرستاده می‌شود. این یعنی شما می‌توانید ویژگی‌های یک شیء را داخل متد تغییر دهید، اما نمی‌توانید خودِ ریفرنس اصلی را به شیء دیگری متصل کنید.

۳. کدهای ماژولار و اصل Single Responsibility

در مهندسی نرم‌افزار حرفه‌ای، هر متد باید فقط و فقط "یک کار" انجام دهد. اگر متد شما بیش از ۲۰ خط شده یا نام آن شامل کلمه "And" است، احتمالاً باید آن را به متدهای کوچک‌تر تقسیم کنید. این کار باعث می‌شود کد شما قابل تست (Testable) و قابل نگهداری باشد.

نکته پایانی: متدها بلوک‌های سازنده هر اپلیکیشن بزرگ هستند. هنرِ یک برنامه‌نویس جاوا در این است که چطور منطقِ پیچیده را به متدهای ساده، کوچک و قابل استفاده مجدد تقسیم کند.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

خطای اسکوپ Easy
سوال تمرین

کد زیر دارای خطای اسکوپ است. آن را طوری اصلاح کنید که متغیر x در کل متد main قابل دسترسی باشد و برنامه بدون خطا عدد 10 را چاپ کند.

پاسخ تمرین
JAVA
public class Main {
  public static void main(String[] args) {
    int x = 10;
    System.out.println(x);
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.