حوزه متغیرها (Java Scope)
حوزه متغیرها (Scope): متغیرها کجا زنده هستند؟ 🌐🔍
در جاوا، متغیرها فقط در داخل منطقهای که تعریف شدهاند قابل دسترسی هستند. به این محدوده Scope گفته میشود.
۱. حوزه متد (Method Scope)
متغیرهایی که مستقیماً داخل یک متد تعریف میشوند، فقط از زمان تعریف تا انتهای همان متد قابل استفاده هستند:
{code_block('static void myMethod() {\n int x = 100; // این متغیر فقط اینجا شناخته میشود\n System.out.println(x);\n}')}۲. حوزه بلوک (Block Scope)
یک بلوک کد شامل کدهایی است که بین دو آکولاد {} قرار دارند. اگر متغیری را داخل یک بلوک (مثل if یا for) تعریف کنید، خارج از آن آکولادها وجود نخواهد داشت:
۳. حوزه کلاس (Class Scope / Fields) 🏛️
اگر متغیر را خارج از متدها اما داخل کلاس تعریف کنید، تمام متدهای آن کلاس میتوانند به آن دسترسی داشته باشند (به این متغیرها Fields یا Attributes میگوییم).
چرا اسکوپ مهم است؟
مدیریت درست اسکوپ باعث جلوگیری از تداخل نامها و همچنین بهینهسازی مصرف حافظه میشود، چون متغیرهای محلی بلافاصله پس از اتمام بلاک از حافظه پاک میشوند.
بخش تخصصی: مهندسی متدها و مدیریت حافظه 🛠️💎
در این بخش، به مفاهیمی میپردازیم که برای درک عمیق مدیریت حافظه و کارایی در جاوا حیاتی هستند.
۱. پشته متد (Method Stack) و فریمها
هر بار که متدی فراخوانی میشود، جاوا یک Stack Frame جدید در حافظه Stack ایجاد میکند. این فریم شامل متغیرهای محلی و پارامترهای متد است. وقتی متد تمام میشود، فریم آن از پشته حذف (Pop) میشود. درک این فرآیند برای دیباگ کردن خطاهایی مثل StackOverflowError بسیار مهم است.
۲. انتقال پارامتر: Pass-by-Value
یک نکته بسیار مهم در جاوا این است که جاوا همیشه مقادیر را به صورت Pass-by-Value منتقل میکند. برای انواع اولیه، خودِ مقدار کپی میشود. برای اشیاء (Objects)، "کپیِ ریفرنس" به متد فرستاده میشود. این یعنی شما میتوانید ویژگیهای یک شیء را داخل متد تغییر دهید، اما نمیتوانید خودِ ریفرنس اصلی را به شیء دیگری متصل کنید.
۳. کدهای ماژولار و اصل Single Responsibility
در مهندسی نرمافزار حرفهای، هر متد باید فقط و فقط "یک کار" انجام دهد. اگر متد شما بیش از ۲۰ خط شده یا نام آن شامل کلمه "And" است، احتمالاً باید آن را به متدهای کوچکتر تقسیم کنید. این کار باعث میشود کد شما قابل تست (Testable) و قابل نگهداری باشد.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
کد زیر دارای خطای اسکوپ است. آن را طوری اصلاح کنید که متغیر x در کل متد main قابل دسترسی باشد و برنامه بدون خطا عدد 10 را چاپ کند.
public class Main {
public static void main(String[] args) {
int x = 10;
System.out.println(x);
}
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.